我试图解决一个问题,该问题需要翻转输入的32位unsigned int的位并打印出来。
我首先尝试通过执行以下操作来解决它:
Scanner scanner = new Scanner(System.in);
// EDIT System.out.println(~scanner.nextLong() | 0);
System.out.println(~scanner.nextLong() | 0x00000000L);
但这并没有得出正确的答案。
然后,我可以用以下方法解决它:
System.out.println(~scanner.nextLong() & 0xFFFFFFFFL);
有人可以向我解释为什么我的第一次尝试没有成功吗?
编辑:澄清了一些代码。
EDIT2:对于那些想知道的人来说,这就是问题所在:https : //www.hackerrank.com/challenges/flipping-bits
EDIT3:天哪。我真的没有考虑到这一点。'〜'仅使用低32位值的long会导致负的long,这是因为long的高32位全部从0翻转为1,并且将long与0进行或运算不会执行任何操作,而将long与0进行AND运算32 1位清除该长整数的高32位,剩下的长整数仅翻转低32位。
我相信让您感到困惑的是,这& 0xFFFFFFFFL
是一种将int
未签名视为签名并将其表示为已签名的方法long
。| 0
什么也没做。从Java 8开始,您还可以使用Integer.toUnsignedString
将int
a转换为String
无符号32位值的表示形式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句