解决方法
这应该适用于所有非负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)
通过移动很长时间,您将获得完整的32位移动,在将其转换为int后,您将获得0.减1将给您-1和x& -1对于任何int值x只是x(x是x的低32位的值).