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

vsikbqxv  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(351)

我正在尝试更改字节[]中的一些位
但是我没有找到正确的条件来改变这个值
假设我的字节是11010101,我需要检查第一位是否是1,并将其更改为0
谢谢

bttbmeg0

bttbmeg01#

按位运算就是您要寻找的。我确信还有更有效的实现,但我将在这个答案中说明这一点。
我将在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 向上加1(在内存的最低位加一个0),就像这样,

0 0 0 0   0 0 1 0

的十进制值 bit1 现在是2!
我们现在有了一个工具,我们需要将一个值移到它在字节中的位置,我们只需要使用“|”运算符将每个位和“或”位移到一起:

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。

f45qwnt8

f45qwnt82#

在java中,byte是有符号类型,因此它的值可以在-128到127之间。数据存储在2的补码中,这意味着第一个(最高有效)位/位表示数字是负数(1)还是非负数(0)。欲了解更多信息,请阅读:https://en.wikipedia.org/wiki/two%27s_complement
所以你可以简单的加128

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

第二种方法是对第一个数字进行异或运算。此代码应执行以下操作:

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

wz8daaqr3#

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

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

相关问题