这看起来相当简单,但我找不到答案。如果我有一个int X,那么从Java中获取N个最低有效位的最佳方法是什么?
答案 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
任何x
值int
只是x
(而x
是x
的低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.
这样做的缺点是你需要为每个位制作一个掩码,所以这可能更适合作为另一种方法。