编辑 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
1
是 int
(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
我正在使用 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
1
是 int
(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