為什么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。
另外,其中很多計算,都使用0x這樣的16進制進行運行:
如 0xF的二進制為 1111 ,即四個1。
0xFF的二進制為 1111 1111 ,即8個1的二進制形式
每多一個F就是多一個4位的1111。
最多8個F。