检查位是否设置为1并更改为0

时间:2016-03-28 04:36:27

标签: java byte bytearray bit

我正在尝试更改字节[]

中的某些位

但我无法找到更改值的正确条件

让我们说我的字节是11010101 我需要检查第1位是否为1并将其更改为0

由于

3 个答案:

答案 0 :(得分:0)

按位操作是您正在寻找的。我确信有更高效的实施,但我只是说明了这个答案的重点。

我通过在Java中使用字节表示位来浪费空间:

//11010101 has a value of -43 because bytes are signed by Java
//MSB
byte bit1 = 1;
byte bit2 = 1;
byte bit3 = 0;
byte bit4 = 1;
byte bit5 = 0;
byte bit6 = 1;
byte bit7 = 0;
byte bit8 = 1;
//LSB

即使我只为我的字节设置值0或1,java也使用8位来存储它们。这意味着,在内存中,我的bit1值占用1个字节(2个半字节)的空间:

0 0 0 0    0 0 0 1

我可以"转移"通过使用按位移位运算符在此空间中值。有两种口味,上下。我会把我的位置换一个:

bit1 << 1;

将整数bit1的位向上移一(向内存中的最低位添加零),如此,

0 0 0 0   0 0 1 0

bit1的十进制值现在为2!

我们现在有了一个工具,我们需要将一个值移到它在字节中的位置,我们只需要移位每个位和按位&#34; OR&#34;他们一起使用&#34; |&#34;操作者:

byte myByte = 0;
myByte = (byte)((bit1 << 8) | (bit2 << 7) | (bit3 << 6) | (bit4 << 5) | (bit5 << 4) | (bit6 << 3) | (bit7 << 2) | (bit8 << 1) | bit8);

我确保将移位和按位OR的结果转换为一个字节,以确保我的结果的格式正确。 myByte现在在内存中看起来像这样:

1 1 0 1   0 1 0 1

这个小数的字节值是-43,因为字节是用Java签名的。您可以使用2恭维来手动检查。

现在,要设置字节的第一位,只需使用带掩码的按位AND!

myByte = (byte)(myByte & 0b11111110);

myByte的十进制值现在为-44。

答案 1 :(得分:0)

您需要先检查第n位是1还是0,如果是1,则将其更改为0.

if(number & (1 << (n-1)){
  number &= ~(1 << (n-1));

答案 2 :(得分:0)

在java中,byte是有符号类型,因此它的值可以在-128到127之间。数据以二进制补码存储,这意味着第一个(最高有效)位/数字表示数字是否为负数( 1)或非负(0)。有关详细信息,请阅读:https://en.wikipedia.org/wiki/Two%27s_complement

所以你可以简单地添加128

byte myByte = 111;
myByte = (byte)(myByte + 128);

第二种方法是对第一个数字使用XOR运算。这段代码应该这样做:

byte myByte = 111;
myByte = myByte ^ 0x80;