12

这似乎很简单,但我找不到答案。如果我有一个 int X,那么在 Java 中从这个 int 中获取 N 个最低有效位的最佳方法是什么?

4

3 回答 3

13

这应该适用于所有非负 N < 33 32:

x & ((1 << N) - 1)

值得详细说明这对N == 31 N == 32是如何工作的。对于N == 31,我们得到1 << N == Integer.MIN_VALUE。当您从中减去 1 时,Java 会默默地环绕到Integer.MAX_VALUE,这正是您所需要的。因为N == 32, 1 位被完全移出,所以1 << N == 0; 然后(1 << N) - 1 == -1,这是所有 32 位设置。

对于N == 32,不幸的是,这不起作用,因为(感谢@zstring!)<<运算符仅移动右侧 mod 32。相反,如果您想避免专门针对这种情况进行测试,您可以使用:

x & ((int)(1L << N) - 1)

通过移动 a long,您得到完整的 32 位移位,在转换回 a 后int,得到 0。减去 1 得到 -1 并且x & -1x适用于任何intx(并且x是 的低 32 位的值x)。

于 2012-10-07T06:19:36.523 回答
4

Ted 的方法可能会更快,但这是另一种方法

x << -N >>> -N

这将所有位向上移动,然后向下移动以切断最高位。

int i = -1;
System.out.println(Integer.toBinaryString(i));
i = i << -5 >>> -5;
System.out.println(Integer.toBinaryString(i));

印刷

11111111111111111111111111111111
11111
于 2012-10-07T06:57:04.053 回答
2

您也可以使用面膜。如果您使用 & 按位运算符,则可以删除您想要删除的任何位(例如最高的 x 位);

int mask = 0x7FFFFFFF                 //Example mask where you will remove the 
                                      // most significant bit 
                                      // (0x7 = 0111b and 0xF = 1111b).
int result = numberToProcess & mask;  //And apply the mask with the &bitwise op.

这样做的缺点是您需要为每个位制作一个掩码,因此通常将其视为另一种方法可能更好。

于 2017-04-15T15:11:22.710 回答