爲何16進制數要與OxFF與運算

如下是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進行與運算而不是其餘值呢?
由於OxFF的16進制數爲ffffffff (即8個f)。按與運算的法則, 算法

先來看二進制的與運算,如:-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進行與運算,由於OxFF的16進行爲 :000000FF。
任意數與OxFF進行與運算都是取16進制的後兩位 加密

運算示例以下:
-127(負數127)的16進製爲:   FFFFFF81
0xFF的16進製爲:           000000FF
則&(與)運算是結果爲:     00000081
因此:Integer.toHexStriing(-127 & 0xFF) 的結果爲:81。 md5

另外,其中不少計算,都使用0x這樣的16進制進行運行:
如 0xF的二進制爲 1111 ,即四個1。
   0xFF的二進制爲 1111 1111 ,即8個1的二進制形式
   每多一個F就是多一個4位的1111。
   最多8個F。 字符串

相關文章
相關標籤/搜索