为什么16进制数要与OxFF与运算

wangjianme 12年前

以下是MD5加密算法示例,其中使用了 OxFF的与运算:

    @Test

    public void md5()throws Exception{

       String pwd = "1234";

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

       byte[] bts = md.digest(pwd.getBytes());//16

       pwd = "";

       for(byte bt : bts){

           System.err.println("src: "+bt);

           String str = Integer.toHexString(bt);

           System.err.println("src-----"+str);

           str = Integer.toHexString(bt & 0xFF);//为儿在算MD5时为什么与要0xff进行与运算呢

           System.err.println("dest"+str);

           if(str.length()<=1){

              str+="f";

           }

           pwd+=str;

           System.err.println("---------------------------------");

       }

       System.err.println("最后的密码是:"+pwd);

    }

我们要讨论的主要问题是,为什么上面注解处要与OxFF进行与运算而不是其他值呢?

因为OxFF16进制数为ffffffff (8f)。按与运算的法则,

 

先来看二进制的与运算,如:-1 & 1 1

-1(负1)的二进制编码为:   11111111      11111111     11111111   11111111   即一个32位的字符串,前面一位是1表示负数

1(正1 的二进制编码为:    00000000    00000000   00000000  00000001   即,只有最后一位是1,其他部分全部为0

&(与运算)的法则结果:  00000000    00000000   00000000   00000001  即,只有当两个都为1时才为1,所以最后的结果为:1(1)

 

则可以知道为什么要与0xFF进行与运算,因为OxFF16进行为 000000FF。任意数与OxFF进行与运算都是取16进制的后两位

运算示例如下:

-127(负数127)16进制为:   FFFFFF81

0xFF16进制为:           000000FF

&(与)运算是结果为:     00000081

所以:Integer.toHexStriing(-127 & 0xFF) 的结果为:81

 

另外,其中很多计算,都使用0x这样的16进制进行运行:

0xF的二进制为 1111 ,即四个1

   0xFF的二进制为 1111 1111 ,81的二进制形式

   每多一个F就是多一个4位的1111

   最多8F