一、原碼反碼補(bǔ)碼
原碼:
我們用8位二進(jìn)制表示一個(gè)數(shù),+11的原碼為00001011麻献,-11的原碼就是10001011
反碼:
一個(gè)數(shù)如果是正,則它的反碼與原碼相同猜扮;
一個(gè)數(shù)如果是負(fù),則符號位為1监婶,其余各位是對原碼取反旅赢;
補(bǔ)碼:
正整數(shù)的補(bǔ)碼與原碼相同齿桃。
求負(fù)整數(shù)的補(bǔ)碼,符號位不變煮盼,數(shù)值位各位取反短纵,最后整個(gè)數(shù)加1。
二僵控、為什么要和0xff進(jìn)行與運(yùn)算
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[ i ] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
1的原碼為 10000001
1的反碼為 11111110
1的補(bǔ)碼為 11111111
0的原碼為 00000000
0的反碼為 11111111(正零和負(fù)零的反碼相同)
0的補(bǔ)碼為 100000000(舍掉打頭的1香到,正零和負(fù)零的補(bǔ)碼相同)
上述代碼中,Integer.toHexString的參數(shù)是int报破,如果不進(jìn)行&0xff悠就,那么當(dāng)一個(gè)byte會轉(zhuǎn)換成int時(shí),由于int是32位充易,而byte只有8位這時(shí)會進(jìn)行補(bǔ)位梗脾,
例如補(bǔ)碼11111111的十進(jìn)制數(shù)為-1轉(zhuǎn)換為int時(shí)變?yōu)?1111111111111111111111111111111好多1啊,呵呵盹靴!即0xffffffff但是這個(gè)數(shù)是不對的炸茧,這種補(bǔ)位就會造成誤差。
和0xff相與后稿静,高24比特就會被清0了梭冠,結(jié)果就對了。
Java中的一個(gè)byte改备,其范圍是-128~127的控漠,而Integer.toHexString的參數(shù)本來是int,如果不進(jìn)行&0xff绍妨,那么當(dāng)一個(gè)byte會轉(zhuǎn)換成int時(shí)润脸,對于負(fù)數(shù),會做位擴(kuò)展他去,舉例來說毙驯,一個(gè)byte的-1(即0xff),會被轉(zhuǎn)換成int的-1(即0xffffffff)灾测,那么轉(zhuǎn)化出的結(jié)果就不是我們想要的了爆价。
而0xff默認(rèn)是整形,所以媳搪,一個(gè)byte跟0xff相與會先將那個(gè)byte轉(zhuǎn)化成整形運(yùn)算铭段,這樣,結(jié)果中的高的24個(gè)比特就總會被清0秦爆,于是結(jié)果總是我們想要的序愚。