在字节中设置特定位

wis*_*shi 78 java byte bit-manipulation

我正在尝试在Java字节变量中设置位.它确实提供了类似的方法.setBit(i).有谁知道我怎么能意识到这一点?

我可以通过给定的字节逐位迭代:

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

}
Run Code Online (Sandbox Code Playgroud)

但是我不能把这个位置设置为1或0,可以吗?

dri*_*iis 133

使用按位OR(|)和AND(&)运算符.设置一个位,即将位pos转到1:

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << bit;              // shorthand
Run Code Online (Sandbox Code Playgroud)

要取消设置,或将其转为0:

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << bit);           // shorthand
Run Code Online (Sandbox Code Playgroud)

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

  • 另见xor算子 - 它是该武器库中的第三个动力工具(参见维基百科关于掩蔽的文章). (3认同)

Jon*_*eet 66

设置一下:

myByte |= 1 << bit;
Run Code Online (Sandbox Code Playgroud)

清除它:

myByte &= ~(1 << bit);
Run Code Online (Sandbox Code Playgroud)

  • @Michael:设置一点意味着制作它1.清除一点意味着将其设为0. (5认同)

use*_*421 23

只是为了补充Jon的回答driis的回答

要切换(反转)一点

    myByte ^= 1 << bit;
Run Code Online (Sandbox Code Playgroud)


Jef*_*tin 10

您需要的技术是隔离所选位并设置或清除它.您已经有表达式来隔离该位,因为您正在使用它来测试它.您可以通过对其进行"或"来设置该位,或者通过按位AND将该位与该位的1位补码清零.

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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

  • 小心点bitset.将位设置为0并清除它没有区别,因此`length()`不会将那些设置为0的位计数 (3认同)