为什么我不能通过与 0 按位或运算来翻转 32 位 unsigned int 的位?

Why can't I flip the bits of a 32 bit unsigned int by bitwise ORing it with 0?

我试图解决一个问题,该问题需要我翻转输入的 32 位无符号整数的位并打印它。

我首先尝试通过这样做来解决它:

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 进行 OR 运算什么都不做,而将那个 long 与32 1 位清除那个 long 的高 32 位,只留下低 32 位翻转的 long。

我认为让您感到困惑的部分是 & 0xFFFFFFFFL 是一种将 int 视为无符号并将其表示为有符号 long 的方法。 | 0 什么都不做。从 Java 8 开始,您还可以使用 Integer.toUnsignedStringint 转换为无符号 32 位值的 String 表示形式。