我正在为我正在做的一些计算生成位掩码,我需要屏蔽一个 int 以便除 x 最右边的位之外的所有位都变为零。我这样做使用:
int mask = ~(-1 << x);
这适用于除 x = 32 之外的所有 x 值。它应该返回 -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;
?
如果是这样,如果超过 int 的 32 位长度,为什么要围绕行为进行这种循环?Oracle 上的文档明确指出:
无符号右移运算符“>>>”将零移到最左边的位置
但很明显,当它必须移动超过 32 倍时,它实际上并没有这样做......