我正在尝试更改字节[]
中的某些位但我无法找到更改值的正确条件
让我们说我的字节是11010101 我需要检查第1位是否为1并将其更改为0
由于
答案 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;