java - 如何设置 Java long 中的*任意*位,即使位位置 > 30

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

我熟悉如何设置和清除 Java 数值变量中的特定位。但我不确定如何操作 long 中位置 > 30 的任何位。

我读到,对于小于 30GB 的堆大小,Java 将 long 作为两个 int 进行处理。将我的堆大小设置为 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

感谢您的阅读 - 任何指导/代码/建议将不胜感激!

最佳答案

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

return bits | (1L << bitPosition)

关于java - 如何设置 Java long 中的*任意*位,即使位位置 > 30,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48332837/

相关文章:

java - Android RecyclerView CountDownTimer 删除并插入新项目后出现问题

java - 将 Java 翻译成 X10

java - 正则表达式导致 StackOverflowError

Javascript 的 Shift right with zero-fill operator (>>>) 产生意想不到的结果

performance - 使用移位和加/减除以常数

excel - Erl() 函数在 64 位 O365 Excel VBA 中不起作用

java - 无法从 OnClickListener 类访问 Application 变量

c++ - pAddress & ~(PAGE_SIZE - 1) 获取页面基地址的技巧是什么

linux - 如何在 x86 平台上运行 MIPS 二进制文件?

c# - Com 调用 64 位服务器上的 32 位应用程序很慢