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,保持了二進制的一致性,
各位如果覺得我分析有道理就給我點個贊吧,如果覺得有問題歡迎指出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/136989.html
標籤:java
