2011-01-12 116 views
65

我试图在Java字节变量中设置位。它确实提供了像.setBit(i)这样的propper方法。有人知道我怎么能意识到这一点?在字节中设置特定位

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

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

} 

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

回答

109

使用按位orand运营商。要设置位:

my_byte = my_byte | (1 << pos); 

要取消设置位:

my_byte = my_byte & ~(1 << pos); 
+3

另请参见异或运算符 - 它是该武器库中的第三个强大工具(请参阅维基百科关于掩蔽的文章)。 – Hardryv 2012-03-29 17:35:58

59

要设置位:

myByte |= 1 << bit; 

要清除它:

myByte &= ~(1 << bit); 
+0

你是什么意思,这将“设置”有点?假设你试图访问第0位,myByte包含11101101.这是什么意思?我如何控制设定的价值? – Michael 2016-03-06 05:08:40

+3

@迈克尔:设置一点意味着使它1.清除一点意味着使它为0. – 2016-03-06 08:50:00

10

你需要的技术是隔离的选择位和设置或清除。你已经有了表达式来隔离这个位,因为你正在使用它来测试它。您可以通过对该位进行或运算来设置该位,也可以通过位的1的补码将该位与位进行清零。

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

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

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