Integer.toHexString()這個方法是將byte位元組轉換為String,下圖的b[n]&0XFF必須轉化成一個int型別的
一個byte在計算機中二進位制只有8位元,而int是32位元的,我們將一個正數由8位元轉化成32位元很簡單:
就是它的原碼再補上24個0,還是原碼,如+5;
byte在二進位制中:0000 0101,
int是將原碼補零:0000 0000 0000 0000 0000 0000 0000 0101。
但如果它是一個負數呢 比如-5,我們在計算機組成原理中定義負數的二進位制是其相反數的二補數,那什麼是二補數呢,二補數就是原碼的反碼+1,反碼就是原碼取反。
這時候又有人為什麼負數要用原碼的二補數表示呢,這裡我們就要引入一個數學概念->模數,它表達的是計量數的容量,
舉個栗子就很容易理解了,鐘錶模數是12,當我們時針轉完一圈時,它又要從1開始計算。和我們二進位制,十進位制,是一個道理。
假設現在是7點,我們要將時針調到3點,我們有兩種辦法,一種是將時針順時針轉8,或者逆時針轉4.所以在模數的概念下:
7 - 4 = 7 + 8,這個差就是模****,4和8就互為補數 。這裡推廣開來就是:A-B或A+(-B)= A+B(補) ,這樣就可以將負數轉化為正數來進行運算,同樣的道理運用到二進位制上,將負數轉化為值來計算。:
+5的原碼是:0000 0101,
+5的反碼是:1111 1010,
+5的二補數是:1111 1011, 所以我們的-5在二進位制可以用1111 1011來表示。
因為byte只有八位,當它轉化為int時變成32位元,所以直接是補上24個零:
int 型別+5二進位制表示式:0000 0000 0000 0000 0000 0000 0000 0101。
-5就要變成+5原碼的二補數:
反碼:1111 1111 1111 1111 1111 1111 1111 1010
二補數:1111 1111 1111 1111 1111 1111 1111 1011
0XFF在二進位制中是這樣的:0000 0000 0000 0000 0000 0000 1111 1111
&運算:0&1 = 0 ,0&0=0,1&1=1
當-5和0XFF進行&運算時得到的結果:0000 0000 0000 0000 0000 0000 1111 1011
會發現 int 和byte得到的負數結果是一樣的,所以加上&0XFF本質上是為了保持二進位制二補數的一致性,當byte轉化為int時,當其為負數時必然高出的24位元會補1,而&0XFF將高出的24位元重新變成0,保持了二進位制的一致性。
各位如果覺得我分析有道理就給我點個贊吧,如果覺得有問題歡迎指出。