天天看點

&0xFF是怎麼個意思[通俗易懂]

大家好,又見面了,我是你們的朋友全棧君。

今天看了下同僚從網上拷貝的base64加密的代碼,看到了這樣如下的代碼

public static String encode(byte[] data) {
   StringBuilder sb = new  StringBuilder();
   int len = data.length;
   int i = 0;
   int b1, b2, b3;
   while (i < len) {
      b1 = data[i++] & 0xff;
      if (i == len) {
         sb.append(base64EncodeChars[b1 >>> 2]);
         sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
         sb.append("==");
         break;
      }
      b2 = data[i++] & 0xff;
      if (i == len) {
         sb.append(base64EncodeChars[b1 >>> 2]);
         sb.append(base64EncodeChars[((b1 & 0x03) << 4)
               | ((b2 & 0xf0) >>> 4)]);
         sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
         sb.append("=");
         break;
      }
      b3 = data[i++] & 0xff;
      sb.append(base64EncodeChars[b1 >>> 2]);
      sb.append(base64EncodeChars[((b1 & 0x03) << 4)
            | ((b2 & 0xf0) >>> 4)]);
      sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
            | ((b3 & 0xc0) >>> 6)]);
      sb.append(base64EncodeChars[b3 & 0x3f]);
   }
   return sb.toString();
}           

複制

我就很想知道data[i++]後面的&0xFF到底是什麼意思,就開始百度。

舉個簡單的例子:

byte[] b = new byte[5];

b[0] = -12;

byte 8位二進制 = 1個位元組 char 2個位元組 short (2個位元組) int(4個位元組) long(8個位元組) float (4個位元組) double(8個位元組)

計算機存儲資料機制:正數存儲的二進制原碼,負數存儲的是二進制的補碼。 補碼是負數的絕對值反碼加1。

比如-12,-12 的絕對值原碼是:0000 1100 取反: 1111 0011 加1: 1111 0100

byte –> int 就是由8位變 32 位 高24位全部補1: 1111 1111 1111 1111 1111 1111 1111 0100 ;

0xFF 是計算機十六進制的表示: 0x就是代表十六進制,A B C D E F 分别代表10 11 12 13 14 15 F就是15 一個F 代表4位二進制:可以看做 是 8 4 2 1。

0xFF的二進制表示就是:1111 1111。 高24位補0:0000 0000 0000 0000 0000 0000 1111 1111;

-12的補碼與0xFF 進行與(&)操作 最後就是0000 0000 0000 0000 0000 0000 1111 0100

轉換為十進制就是 244。

byte類型的數字要&0xff再指派給int類型,其本質原因就是想保持二進制補碼的一緻性。

當byte要轉化為int的時候,高的24位必然會補1,這樣,其二進制補碼其實已經不一緻了,&0xff可以将高的24位置為0,低8位保持原樣。這樣做的目的就是為了保證二進制資料的一緻性。

有人問為什麼上面的式子中b[0]不是8位而是32位,因為當系統檢測到byte可能會轉化成int或者說byte與int類型進行運算的時候,就會将byte的記憶體空間高位補1(也就是按符号位補位)擴充到32位,再參與運算。

謝謝這個大哥的部落格,看了他的部落格才明白。參考位址:點選打開連結

[其實是從數字類型擴充到較寬的類型時,補零擴充還是補符号位擴充。

這是因為Java中隻有有符号數,當byte擴充到short, int時,即正數都一樣,因為為符号位是0,是以無論如何都是補零擴充;但負數補零擴充和按符号位擴充結果完全不同。

補符号數,原數值不變。

補零時,相當于把有符号數看成無符号數,比如-127 = 0x81,看成無符号數就是129, 256 + (- 127)

對于有符号數,從小擴充大時,需要用&0xff這樣方式來確定是按補零擴充。

而從大向小處理,符号位自動無效,是以不用處理。] -> 來自博文評論:https://www.cnblogs.com/think-in-java/p/5527389.html

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/147992.html原文連結:https://javaforall.cn