编辑 java 中的位序列

Editing a bit sequence in java

我正在使用 java longs 来存储位序列,我想用给定的位置编辑它们。首先,这是我声明和初始化我的位的方式。

long singleBit = 0b0000000000000000000000000000000000000000000000000000000000000000L;

首先,在java中有没有更简单的初始化64位的方法?无论如何,然后我使用左移运算符尝试编辑位序列。

System.out.println(Long.toBinaryString( singleBit | 1 << 62));

基本上我想要的是在这个序列的第 62 个索引上插入一个 1,但是当我打印出来时,它给了我这个:

1000000000000000000000000000000

显然缺少很多尾随 0。它也对第 63 个索引和序列末尾的许多其他索引发生故障。这有什么理由吗?我对位操作相当满意,但这让我感到困惑。如果不是在 shift 语句中只使用“1”,而是在它的位置使用类似这样的东西:

long oneBit = 0b0000000000000000000000000000000000000000000000000000000000000001L;

然后它起作用了,但是它抛出了我的 OR 语句。这个行为不正确是有原因的吗?谢谢。

First of all, is there any easier way to initialize a 64bit in java?

是的,改用十六进制:

long singleBit = 0x00000000;

如果你想显式设置第一位而不进行任何位操作,你可以这样做

long singleBit = 0x80000000;

Basically what I want is to insert a 1 on the 62nd index of this sequence, but when I print it out, it gives me this:

这是因为 1 是一个 int。使用 1L 作为 long 文字。

问题是1 << 62

1int(32 位),而不是 long。令人惊讶的是,在许多体系结构上,当您移位 int 时,仅使用移位的低 5 位。

您指定为 62 的班次最终为 (62%32) = 30。

你应该看看 BitSet。它主要用于处理任意大的位串,但您可以使用任何大小。它有很多非常有用的方法。这是您可能会做的事情。

BitSet b = new BitSet();
b.set(62);
System.out.println(Long.toBinaryString(b.toLongArray()[0]));
// or
b.set(10,23);
System.out.println(b.toString()); // shows just the bits that are set
System.out.println(Long.toBinaryString(b.toLongArray()[0]));

版画

100000000000000000000000000000000000000000000000000000000000000
{10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 62}
100000000000000000000000000000000000000011111111111110000000000