负整数位运算疑问:(-15) & (-1 >> 1)为何返回-15?
问题解惑:为什么
(-15) & (-1 >> 1)结果是-15? 核心原因是Java中负数的右移操作是算术右移,不是你以为的逻辑右移,具体拆解如下:
- 先看
-1的二进制:Java的int是32位有符号数,-1的二进制是全1:11111111 11111111 11111111 11111111。 - 执行
-1 >> 1:这是算术右移,规则是符号位保持不变,左侧补符号位(即补1),所以移位后结果还是全1的二进制,对应十进制依然是-1,而不是你想的01111111...。 - 最后执行
(-15) & (-1):按位与操作中,任何数和全1的二进制按位与,结果都是它本身,所以-15 & -1的结果就是-15。
如果要得到你预期的“最高有效位置0”的掩码,需要用逻辑右移运算符>>>,它不管正负,左侧一律补0。比如-1 >>> 1的结果是2147483647(二进制01111111 11111111 11111111 11111111),这时(-15) & (-1 >>>1)的结果才是15(因为把-15的符号位清零了)。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

