為什么16進制數要與OxFF與運算

wangjianme 12年前發布 | 115K 次閱讀 Java 加密 算法 Java開發

以下是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

 本文由用戶 wangjianme 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!