从Int获得n个最低有效位

时间:2012-10-07 06:18:15

标签: java bit-manipulation

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

3 个答案:

答案 0 :(得分: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)

通过移动long,您可以获得完整的32位移位,在转换回int之后,获得0.减去1会得到-1和x & -1任何xint只是x(而xx的低32位的值。

答案 1 :(得分: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

答案 2 :(得分:1)

您也可以使用面具。如果您使用&amp;按位运算符,然后你可以删除你想要删除的任何位(比如最高的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.

这样做的缺点是你需要为每个位制作一个掩码,所以这可能更适合作为另一种方法。