我正在为我正在做的一些计算生成位掩码,我需要屏蔽一个int,除了最右边的x之外的所有都变为零.我这样做使用:
int mask = ~(-1 << x);
Run Code Online (Sandbox Code Playgroud)
这适用于x的所有值,除了x = 32.它应该返回-1然后,但它返回0.这里发生了什么?
另外,我试过这个:
int mask = -1 >>> 32 - x;
Run Code Online (Sandbox Code Playgroud)
在x = 0时,它应该返回0,但它返回-1.以某种方式将某些东西移动32会导致操作返回操作员的左侧.当我尝试将-1移位33或34位时,它返回一个值,好像它移动了1或2.我是否正确假设Java实际上是这样做的:
int mask = ~(-1 << x % 32);
Run Code Online (Sandbox Code Playgroud)
和
int mask = -1 >>> (32 - x) % 32;
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,如果你超过int的32位长度,你为什么要这个循环行为呢?有关Oracle的文档明确指出:
无符号右移运算符">>>"将零移动到最左边的位置
但显然,当它必须超过32时,它实际上并不是它正在做的事情......
是的,你是对的; long在应用之前,移位被32(或64 )修改.
如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x1f(0b11111)的影响.因此,实际使用的移位距离始终在0到31的范围内,包括0和31.
如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x3f(0b111111)的影响.因此,实际使用的移位距离始终在0到63的范围内,包括0和63.
至于为什么 Java的选择了这个行为,我不会对你有任何建议.
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |