2016-03-28 92 views
0

我想在一个byte []检查位被​​设置为1,更改为0

更改某些位,但我一直没能找到正确的状态更改值

让说我的字节是11010101 我需要检查,如果第1位为1,将其更改为0

感谢

+0

[本文可能会帮助您在正确的方向。](http://stackoverflow.com/q/12015598/2650847) –

回答

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!我们现在有了一个工具,我们需要将一个值转移到它在字节中的位置,我们只需要移动我们的每个位,并使用“|”将它们逐位“或”运营商:

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

我一定要投的变化和按位OR值的结果为byte确保我的结果的正确格式。 myByte现在看起来是这样的记忆:

1 1 0 1 0 1 0 1 

在小数的这个字节的值是-43,因为字节在Java中签署。你可以用2的赞美来手工检查。

现在,要设置您的字节的第一位,您只需使用按位与与面具!

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

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

0

需要先检查第n位为1或0,如果它是1,那么它变成0。

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

在java中,字节是签名型,所以其值可以是间-128和127.数据以二进制补码形式存储,这意味着第一个(最重要的)位/数字指示数字是负数(1)还是非负数(0)。欲了解更多信息,请阅读此:https://en.wikipedia.org/wiki/Two%27s_complement

所以,你可以

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

第二种方法是使用XOR操作只需添加128到它的第一位。此代码应该这样做:

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