我正在生成一些位掩码进行计算,其中我需要屏蔽一个整数,使得除了最右边的x位之外,所有其他位都变为零。我使用以下方法进行此操作:
int mask = ~(-1 << x);
这段代码对于除了x等于32的所有值都可以正常工作,但是当x等于32时应该返回-1,但实际上它返回了0。这里发生了什么?
另外,我尝试过这个:
int mask = -1 >>> 32 - x;
当x = 0时,它应该返回0,但实际上它返回的是-1。不知何故,将某些东西向左移32位会导致操作返回运算符的左侧。当我尝试将-1向左移动33或34位时,它返回一个值,就好像它向左移动了1或2位。我是否正确地认为Java实际上会执行这样的操作:
int mask = ~(-1 << x % 32);
并且
int mask = -1 >>> (32 - x) % 32;
如果超过32位int长度,为什么你还想要这种循环行为呢?Oracle的文档清楚地说明:
无符号右移位运算符">>>"会在最左边位置插入0
但是当它需要移动超过32位时,显然并不是这样做的...