以字节更改位值
我在字段类型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文章 。