我正在尝试更改字节[]中的一些位但是我没有找到正确的条件来改变这个值假设我的字节是11010101,我需要检查第一位是否是1,并将其更改为0谢谢
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个半字节)的空间:
bit1
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 现在在记忆中是这样的:
myByte
1 1 0 1 0 1 0 1
这个字节的十进制值是-43,因为字节是用java签名的。你可以用2的恭维来手工检查。现在,要设置字节的第一位,只需使用带掩码的按位and!
myByte = (byte)(myByte & 0b11111110);
的十进制值 myByte 现在是-44。
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;
wz8daaqr3#
您需要首先检查第n位是1还是0,如果是1,则将其更改为0。
if(number & (1 << (n-1)){ number &= ~(1 << (n-1));
3条答案
按热度按时间bttbmeg01#
按位运算就是您要寻找的。我确信还有更有效的实现,但我将在这个答案中说明这一点。
我将在java中使用字节来表示位,从而浪费空间:
即使我只将字节的值设置为0或1,java也使用8位来存储它们。那意味着,在记忆中,我的
bit1
值占用1字节(2个半字节)的空间:我可以使用位移位运算符在这个空间中“移位”这个值。有上下两种口味。我要把我的位子调高一点:
将整数的位移位
bit1
向上加1(在内存的最低位加一个0),就像这样,的十进制值
bit1
现在是2!我们现在有了一个工具,我们需要将一个值移到它在字节中的位置,我们只需要使用“|”运算符将每个位和“或”位移到一起:
我确保将移位和按位OR的结果转换为一个字节,以确保结果的格式正确。
myByte
现在在记忆中是这样的:这个字节的十进制值是-43,因为字节是用java签名的。你可以用2的恭维来手工检查。
现在,要设置字节的第一位,只需使用带掩码的按位and!
的十进制值
myByte
现在是-44。f45qwnt82#
在java中,byte是有符号类型,因此它的值可以在-128到127之间。数据存储在2的补码中,这意味着第一个(最高有效)位/位表示数字是负数(1)还是非负数(0)。欲了解更多信息,请阅读:https://en.wikipedia.org/wiki/two%27s_complement
所以你可以简单的加128
第二种方法是对第一个数字进行异或运算。此代码应执行以下操作:
wz8daaqr3#
您需要首先检查第n位是1还是0,如果是1,则将其更改为0。