如何在Java中设置* any *位,即使位位置> 30

时间:2018-01-19 01:26:34

标签: java bit-manipulation 64-bit 32bit-64bit long-integer

我熟悉如何设置和清除Java数字变量中的特定位。但我不知道如何操纵位置上的任何位> long中的30个。

我已经读过Java将longs处理为两个ints,其堆大小小于30gb。将我的堆大小设置为45gb(在EC2实例上)没有帮助。

我确认我使用的是64位Java:

$ java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)

有没有办法更改Java long中任何位置的位?

我认为this是同一个问题,但对于C.但它对我没有帮助。

这是代码和输出,说明了我的困境。正如您所看到的,它在第31位时效果很好。

private static long setBit(long bits, int bitPosition) {
  return bits | (1 << bitPosition);
}

private static long clearBit(long bits, int bitPosition) {
  return bits & ~(1 << bitPosition);
}

public static void main(String[] args) {

  for (int i = 0; i < 64; i++) {

    long myLong = clearBit(Long.MAX_VALUE, i);

    System.out.println(Long.toBinaryString(myLong) + " " + i + " " + myLong);
  }
}

输出:

111111111111111111111111111111111111111111111111111111111111110 0 9223372036854775806
111111111111111111111111111111111111111111111111111111111111101 1 9223372036854775805
111111111111111111111111111111111111111111111111111111111111011 2 9223372036854775803
111111111111111111111111111111111111111111111111111111111110111 3 9223372036854775799
111111111111111111111111111111111111111111111111111111111101111 4 9223372036854775791
111111111111111111111111111111111111111111111111111111111011111 5 9223372036854775775
111111111111111111111111111111111111111111111111111111110111111 6 9223372036854775743
111111111111111111111111111111111111111111111111111111101111111 7 9223372036854775679
111111111111111111111111111111111111111111111111111111011111111 8 9223372036854775551
111111111111111111111111111111111111111111111111111110111111111 9 9223372036854775295
111111111111111111111111111111111111111111111111111101111111111 10 9223372036854774783
111111111111111111111111111111111111111111111111111011111111111 11 9223372036854773759
111111111111111111111111111111111111111111111111110111111111111 12 9223372036854771711
111111111111111111111111111111111111111111111111101111111111111 13 9223372036854767615
111111111111111111111111111111111111111111111111011111111111111 14 9223372036854759423
111111111111111111111111111111111111111111111110111111111111111 15 9223372036854743039
111111111111111111111111111111111111111111111101111111111111111 16 9223372036854710271
111111111111111111111111111111111111111111111011111111111111111 17 9223372036854644735
111111111111111111111111111111111111111111110111111111111111111 18 9223372036854513663
111111111111111111111111111111111111111111101111111111111111111 19 9223372036854251519
111111111111111111111111111111111111111111011111111111111111111 20 9223372036853727231
111111111111111111111111111111111111111110111111111111111111111 21 9223372036852678655
111111111111111111111111111111111111111101111111111111111111111 22 9223372036850581503
111111111111111111111111111111111111111011111111111111111111111 23 9223372036846387199
111111111111111111111111111111111111110111111111111111111111111 24 9223372036837998591
111111111111111111111111111111111111101111111111111111111111111 25 9223372036821221375
111111111111111111111111111111111111011111111111111111111111111 26 9223372036787666943
111111111111111111111111111111111110111111111111111111111111111 27 9223372036720558079
111111111111111111111111111111111101111111111111111111111111111 28 9223372036586340351
111111111111111111111111111111111011111111111111111111111111111 29 9223372036317904895
111111111111111111111111111111110111111111111111111111111111111 30 9223372035781033983
1111111111111111111111111111111 31 2147483647
111111111111111111111111111111111111111111111111111111111111110 32 9223372036854775806
111111111111111111111111111111111111111111111111111111111111101 33 9223372036854775805
111111111111111111111111111111111111111111111111111111111111011 34 9223372036854775803
111111111111111111111111111111111111111111111111111111111110111 35 9223372036854775799
111111111111111111111111111111111111111111111111111111111101111 36 9223372036854775791
111111111111111111111111111111111111111111111111111111111011111 37 9223372036854775775
111111111111111111111111111111111111111111111111111111110111111 38 9223372036854775743
111111111111111111111111111111111111111111111111111111101111111 39 9223372036854775679
111111111111111111111111111111111111111111111111111111011111111 40 9223372036854775551
111111111111111111111111111111111111111111111111111110111111111 41 9223372036854775295
111111111111111111111111111111111111111111111111111101111111111 42 9223372036854774783
111111111111111111111111111111111111111111111111111011111111111 43 9223372036854773759
111111111111111111111111111111111111111111111111110111111111111 44 9223372036854771711
111111111111111111111111111111111111111111111111101111111111111 45 9223372036854767615
111111111111111111111111111111111111111111111111011111111111111 46 9223372036854759423
111111111111111111111111111111111111111111111110111111111111111 47 9223372036854743039
111111111111111111111111111111111111111111111101111111111111111 48 9223372036854710271
111111111111111111111111111111111111111111111011111111111111111 49 9223372036854644735
111111111111111111111111111111111111111111110111111111111111111 50 9223372036854513663
111111111111111111111111111111111111111111101111111111111111111 51 9223372036854251519
111111111111111111111111111111111111111111011111111111111111111 52 9223372036853727231
111111111111111111111111111111111111111110111111111111111111111 53 9223372036852678655
111111111111111111111111111111111111111101111111111111111111111 54 9223372036850581503
111111111111111111111111111111111111111011111111111111111111111 55 9223372036846387199
111111111111111111111111111111111111110111111111111111111111111 56 9223372036837998591
111111111111111111111111111111111111101111111111111111111111111 57 9223372036821221375
111111111111111111111111111111111111011111111111111111111111111 58 9223372036787666943
111111111111111111111111111111111110111111111111111111111111111 59 9223372036720558079
111111111111111111111111111111111101111111111111111111111111111 60 9223372036586340351
111111111111111111111111111111111011111111111111111111111111111 61 9223372036317904895
111111111111111111111111111111110111111111111111111111111111111 62 9223372035781033983
1111111111111111111111111111111 63 2147483647

感谢您阅读 - 我们将非常感谢任何指导/代码/建议!

2 个答案:

答案 0 :(得分:3)

1<<32会溢出,因为它是int。 您必须将其更改为long

return bits | (1L << bitPosition)

答案 1 :(得分:1)

private static long clearBit(long bits, int bitPosition) {
  return bits & ~(1l << bitPosition);
}

1没有l是一个int,这是你的错误。