手把手教你 bytes[i] & 0xFF 原理詳解

代碼中加密的時候 用到bytes[i] & 0xFF

  MessageDigest md5 = MessageDigest.getInstance("MD5");

            bytes = md5.digest(basestring.toString().getBytes("UTF-8"));

   。。。。。。。。。

   String hex = Integer.toHexString(bytes[i] & 0xFF);

首先你得清楚幾個個概念 

    1.byte的取值範圍

        byte java 中一個字節 8位 即 -2^7—2^7-1  範圍是 -128——127 (*對這個有疑問嗎?在2 中解答)

     2.計算機中負數的存儲的值是它的補碼

       補碼計算方法  負數取值是它的絕對值,的二進制數,取反,加1,那麼對於          -128——-1的存儲 就知道了吧

                舉個例子 -12   絕對值------> 12  就是   0000  1100  取反------> 1111 0011 加 1  1111 0100 (曉得不)

        那麼-128——127  就可以理解了

          -128  是    絕對值 128  二進制-------->  1000 0000   取反  0111 1111(127)  加1  ,1000 0000 (128)

          -1 的絕對值 是  1   0000 0001  取反  1111 1110 加1   1111 1111 (255) 

         計算機 中   -128——-1 對應存儲的是   128-255  

          再看 2^7-1  也就是127 剛好 是0111 1111  爲啥減1  因爲 128 已經被佔了 所以  

       -128——127  在數據庫中真實存的是   128——255  外加  0——127   也就是 byte真正在計算機中存儲範圍是 

              0——255 只不過我們說的是它的取值範圍  是 -128——127

     3.byte 轉 int 16進制 (int  -2^31——2^31-1)

      bytes[i] & 0xFF

              byte和int運算,計算機會自動將 byte轉化爲32位,然後再運算,也就是8位轉32位,那麼計算機會自動將高位補1

              所以-12 在計算機種就是    1111 0011--------> 1111 1111 1111 1111 1111 1111 1111 0100

    然後 &  0xFF     

             0x 代表16進制   每一位取值範圍是  0 —— 15 

              但是 10——15之間是兩位數字了,會和10進制分部開 所以 10——15就對應了 A——F

             那麼0xFF 就是   0000 0000 0000 0000 0000 0000 1111 1111 

             &運算  得到 0000 0000 0000 0000  0000 0000  1111 0100

有沒有發現什麼?低八位  1111 0011  沒有改變 ,那麼爲什麼  &  0xFF而不是別的呢?

  原因就是 byte 轉int 前24位都被計算機強制 變成了1,    1111 1111 1111 1111 1111 1111 1111 0100 轉化成int已經不是

-12在計算機中存儲的值了,&  0xFF   0000 0000 0000 0000 0000 0000 1111 1111 恰好前24位都是 0,進行&運算,只會保留

低八位,也就是byte中原來在計算機中存儲的值  1111 0100。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章