【发布时间】:2021-05-07 16:48:28
【问题描述】:
我尝试了各种组合以更好地理解 XOR 运算符,但我无法弄清楚在负数的情况下按位实际上是如何工作的,因为在正数的情况下它很好(如预期的那样)但产生在对负数应用相同的逻辑时,按位与(&)、按位异或(^)和按位或(|)情况下的结果不同。
如果是正数:
x = 26;
y = 3;
System.out.println(x ^ y); // 25
System.out.println(x & y); // 2
System.out.println(x | y); // 27
11010 -> 26
00011 -> 3
Applying XOR Applying AND Applying OR
11010 11010 11010
00011 00011 00011
----- ----- -----
11001 -> 25 00010 -> 2 11011 -> 27
手动分析时的预期输出。
但是,如果是负数:
x = 26;
y = -3;
System.out.println(x ^ y); // -25
System.out.println(x & y); // 24
System.out.println(x | y); // -1
00000000000000000000000000011010 --> 26
11111111111111111111111111111101 --> -3(2s complement of -3)
Applying XOR Applying OR
00000000000000000000000000011010 00000000000000000000000000011010
11111111111111111111111111111101 11111111111111111111111111111101
-------------------------------- --------------------------------
11111111111111111111111111100111 11111111111111111111111111111111
(不是预期的输出,因为在手动分析时它会给出不同的输出,因为如果我将 XOR(11111111111111111111111111100111) 和 OR(11111111111111111111111111111111) 的结果转换为十进制,那么它将给出一个巨大的数字,这与预期的输出相去甚远)
任何我不熟悉的内部正在做什么的建议,或者在负数的情况下按位 XOR(|)、AND(&) 和 OR(|) 的功能
【问题讨论】:
-
为什么你认为 11010 可以表示 26 而 11101 可以表示 -3 在相同的表示中?要么都是负数,要么都不是负数。
-
换句话说,你任意决定用 5 位而不是 32 位来表示数字,这会让你错过一些关于这些数字的关键上下文。
-
@FedericoklezCulloca 我知道它们用 32 位表示,如果我在前面应用 0 和 1 并对 26 和 -3 位进行 XOR 或 OR 运算,即使那样我也没有得到手动分析时的预期输出。
-
您希望负数的结果是什么?你向我们展示了结果是什么,但没有告诉我们你为什么期望它们不同或你期望它们是什么。
-
好的,所以问题不在于代码。问题在于您在脑海中进行的计算。正确公式:
-2^32 + (2^31 + 2^30 + ...)。对于负数,填充 32 位中的第一个。因此,您从其余位中减去第一个(负)位。根据您的公式,-3在二进制中也是一个巨大的数字,您为什么不感到惊讶?
标签: java bit-manipulation bitwise-operators