以字节为单位设置特定位


78

我正在尝试在Java字节变量中设置位。它确实提供了类似的适当方法.setBit(i)。有人知道我该怎么实现吗?

我可以逐位遍历给定的字节:

if( (my_byte & (1 << i)) == 0 ){

}

但是我不能将此位置设置为1或0,可以吗?



@phuclv这是一个C / C ++问题,而不是Java问题。
Mark Rotteveel

@MarkRotteveel使用相同的语法。如果事实是这样,则应将标签重命名为类似C的名称
phuclv

@phuclv在我看来,它使用相同语法的事实不是关闭重复项的充分理由。
Mark Rotteveel

Answers:


142

使用按位OR|)和AND&)运算符。要设置一点,即将其pos转到1

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

取消设置或将其转到0

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

有关示例,请参见高级Java /按位运算符。


3
另请参阅xor运算符-这是该武器库中的第三个电动工具(请参阅Wikipedia上有关遮罩的文章)。
Hardryv 2012年

哇。这实际上是基础计算机科学的东西,但仍然让我
震惊

66

设置一下:

myByte |= 1 << bit;

要清除它:

myByte &= ~(1 << bit);

1
你是什​​么意思,这将“设置”一点?说您正在尝试访问第0位,并且myByte包含11101101。这是什么意思?如何控制所设置的值?
迈克尔

6
@迈克尔:设置一个位手段使其1.清除位装置使之为0。
乔恩斯基特

26

只是为了补充乔恩的答案德里斯的答案

略微切换(反转)

    myByte ^= 1 << bit;

1
@ernesto,但它没有具体回答问题。他问如何设置位,而不是切换位。它们是有区别的。当然,您可以先检查一下该位,然后在需要时进行切换,但这也将是2个单独的任务……
贾斯汀·史密斯

12

您需要的技术是隔离选定的位并设置或清除它。您已经有了隔离位的表达式,因为您正在上面进行测试。您可以通过对其进行“或”运算来设置该位,也可以按位与该位的1的补码按位与进行清除。

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);

8

请参阅为您完成工作的类java.util.BitSet。

设置:myByte.set(bit); 重置:myByte.clear(bit); 填充布尔myByte.set(bit, b); 值:b = myByte.get(bit); 获取布尔值:获取位图:byte bitMap = myByte.toByteArray()[0];


3
小心位。将位设置为0和将其清除之间没有区别,因此length()不会计算那些设置为0的位
Alex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.