以字节更改位值

我在字段类型Byte中有一些数据(我在字节中保存了8个输入,每个位都是一个输入)。 如何仅更改该字段中的一个输入(字节),但不丢失其他信息(例如,将第七位更改为一,或将第六位更改为零)?

要将第七位设置为1:

 b = (byte) (b | (1 << 6)); 

要将第六位设置为零:

 b = (byte) (b & ~(1 << 5)); 

(位位置实际上是基于0的,所以这就是“第七位”映射到1 << 6而不是1 << 7 。)

b声明为基本类型byte

 byte b = ...; 

然后,您可以使用组合二进制操作和赋值的复合赋值运算符(这在Byte不起作用):

 b |= (1 << bitIndex); // set a bit to 1 b &= ~(1 << bitIndex); // set a bit to 0 

如果没有赋值运算符,则需要进行强制转换,因为|的结果 和& operations是一个int

 b = (byte) (b | (1 << bitIndex)); b = (byte) (b & ~(1 << bitIndex)); 

强制转换隐含在复合赋值运算符中,请参阅Java语言规范 。

设置一下使用:

 public final static byte setBit(byte _byte,int bitPosition,boolean bitValue) { if (bitValue) return (byte) (_byte | (1 << bitPosition)); return (byte) (_byte & ~(1 << bitPosition)); } 

要获得一点价值,请使用:

 public final static Boolean getBit(byte _byte, int bitPosition) { return (_byte & (1 << bitPosition)) != 0; } 

请注意,“Byte”包装类是不可变的,您需要使用“byte”。

你真的应该自己去研究和,或者和xor的屏蔽函数 – 它们允许你同时validation,validation或改变…单个字节结构中的一个,一些或所有位声明。

我不是一个java程序员,但它来自C,在线快速搜索似乎显示了对那些按位操作的支持。

有关此技术的更多信息,请参阅此Wikipedia文章 。