1 回答
TA贡献1789条经验 获得超10个赞
按位运算符的工作方式完全符合您的预期。它们是严格的位运算符,根本不考虑位的语义。
有时,使用断点运行代码最为简单。对于您的具体示例,我将操作的步骤转换为原子语句,并使用 打印结果。Long.toString
int x = -57;
// step 1:
long xCast = (long) x;
System.out.println(Long.toString(xCast, 2)); // -1110011 - this is not the bitwise representation however.
long mask = 0xffffffffL;
System.out.println(Long.toString(mask, 2)); // 11111111111111111111111111111111
// step 2:
long result = ((long) x) & mask;
System.out.println(Long.toString(result, 2)); // 11111111111111111111111111000111
步骤 1 是操作外观的主要原因。在 Java 中,所有(严格数字)值都是有符号的(字符是无符号的)。这意味着,正如您正确指出的那样,所有最高位都是符号位。然而,有趣的部分是,如果一个数字是负数,那么其余位会做什么。以下主题已经涵盖了“二的补码”的基础知识:什么是“2的补码”?这个维基百科页面也是如此:https://en.wikipedia.org/wiki/Two%27s_complement
为了缩短它,在java中,对于整数:
int zero = 0; // == 0b00000000_00000000_00000000_00000000
int maxPositive = Integer.MAX_VALUE; // == 0b01111111_11111111_11111111_11111111
int minus1 = -1; // == 0b11111111_11111111_11111111_11111111
int minNegative = Integer.MIN_VALUE; // == 0b10000000_00000000_00000000_00000000
因此,一切正常的原因是,如果整数为负数,则在强制转换时,整个上部 32 位将转换为 1,否则数字的表示值将发生变化。有效:
int x = 0b11111111_11111111_11111111_11000111;
转换为:
long xCast = 0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11000111;
由于您作为开发人员希望该方法仅返回初始设置的位,因此您必须从结果中屏蔽上位。这是在步骤 2 中完成的。
因此,您的示例的答案:Java中非浮动值的表示是二的补码,因此,当智能地将值从int转换为long时,对于负数,上面的位被1填充。因此,它们必须被删除。
添加回答
举报
