一、與運算符的理解(&): java
參加運算的兩個數據,按二進位進行「與」運算。若是兩個相應的二進位都爲1,則該位的結果值爲1,不然爲0。即 0&0=0;0&1=0;1&0=0;1&1=1; 數組
例子:int x = 62255550; y =0xff; spa
轉二進制:x = 62255550 = 11101101011111000110111110; code
y = 0xFF = 11111111; ci
11 10110101 11110001 10111110 編譯器
&00 00000000 00000000 11111111 數學
00 00000000 00000000 10111110 io
(從右到左作與運算,不足的補0) 編譯
若是參加&運算的是負數(如-3 & -5),則以補碼形式表示爲二進制數,而後按位進行「與」運算。 table
二、移位運算:java移位運算符三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。
--一、 左移運算符
左移運算符<<使指定值的全部位都左移規定的次數。
1)它的通用格式以下所示:
value << num
num 指定要移位值value 移動的位數。
左移的規則只記住一點:丟棄最高位,0補最低位
若是移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。
2)運算規則
按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。
當左移的運算數是int 類型時,每移動1位它的第31位就要被移出而且丟棄;
當左移的運算數是long 類型時,每移動1位它的第63位就要被移出而且丟棄。
當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
3)數學意義
在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方
4)計算過程:
例如:3 <<2(3爲int型)
1)把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,
2)把該數字高位(左側)的兩個零移出,其餘的數字都朝左平移2位,
3)在低位(右側)的兩個空位補零。則獲得的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,
轉換爲十進制是12。
--二、 右移運算符
右移運算符<<使指定值的全部位都右移規定的次數。
1)它的通用格式以下所示:
value >> num
num 指定要移位值value 移動的位數。
右移的規則只記住一點:符號位不變,左邊補上符號位
2)運算規則:
按二進制形式把全部的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1
當右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
例如,若是要移走的值爲負數,每一次右移都在左邊補1,若是要移走的值爲正數,每一次右移都在左邊補0,這叫作符號位擴展(保留符號位)(sign extension ),在進行右移
操做時用來保持負數的符號。
3)數學意義
右移一位至關於除2,右移n位至關於除以2的n次方。
4)計算過程
11 >>2(11爲int型)
1)11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011
2)把低位的最後兩個數字移出,由於該數字是正數,因此在高位補零。
3)最終結果是0000 0000 0000 0000 0000 0000 0000 0010。
轉換爲十進制是2。
35 >> 2(35爲int型)
35轉換爲二進制:0000 0000 0000 0000 0000 0000 0010 0011
把低位的最後兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000
轉換爲十進制: 8
5)在右移時不保留符號的出來
右移後的值與0x0f進行按位與運算,這樣能夠捨棄任何的符號位擴展,以便獲得的值能夠做爲定義數組的下標,從而獲得對應數組元素表明的十六進制字符。
--三、無符號右移
無符號右移運算符>>>
它的通用格式以下所示:
value >>> num
num 指定要移位值value 移動的位數。
無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位
無符號右移運算符>>> 只是對32位和64位的值有意義
三、java中:
1 |
一個byte 佔一個字節,即8位比特; |
2 |
一個int 佔4個字節,即32比特; |
3 |
java的二進制採用的是補碼形式 ⑴一個數爲正,則它的原碼、反碼、補碼相同 ⑵一個數爲負,剛符號位爲1,其他各位是對原碼取反,而後整個數加1 由於補碼存在,因此右移運算後要與0xff相與運算 |
4 |
在Java中,當咱們要將int 轉換爲byte數組時,一個int就須要長度爲4個字節的數組來存放,其中一次從數組下標爲[0]開始存放int的高位到低位。 |
5 |
Java中的一個byte,其範圍是-128~127的,而Integer.toHexString的參數原本是int,若是不進行&0xff,那麼當一個byte會轉換成int時,對於負數,會作位擴展,舉例來講,一個byte的-1(即0xff),會被轉換成int的-1(即0xffffffff),那麼轉化出的結果就不是咱們想要的了。
而0xff默認是整形,因此,一個byte跟0xff相與會先將那個byte轉化成整形運算,這樣,結果中的高的24個比特就總會被清0,因而結果老是咱們想要的。 |
四、代碼:
/** * int到byte[] * @param i * @return */ public static byte[] intToByteArray(int i) { byte[] result = new byte[4]; //由高位到低位 result[0] = (byte)((i >> 24) & 0xFF); result[1] = (byte)((i >> 16) & 0xFF); result[2] = (byte)((i >> 8) & 0xFF); result[3] = (byte)(i & 0xFF); return result; } /** * byte[]轉int * @param bytes * @return */ public static int byteArrayToInt(byte[] bytes) { int value= 0; //由高位到低位 for (int i = 0; i < 4; i++) { int shift= (4 - 1 - i) * 8; value +=(bytes[i] & 0x000000FF) << shift;//往高位遊 } return value; }