2016-03-28 54 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;