手把手教你 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。

 

     

猜你喜欢

转载自blog.csdn.net/xuedengyong/article/details/81386225