最近寫了幾道位運(yùn)算的題目,順便復(fù)習(xí)一下位運(yùn)算的基本知識。
反碼:將二進(jìn)制的所有值取反,0變成1,1變成0
補(bǔ)碼:反碼加一
二進(jìn)制轉(zhuǎn)換
正常情況下,我們可以用Integer.toBinaryString()來獲取一個(gè)負(fù)數(shù)的二進(jìn)制字符串,但是將二進(jìn)制字符串轉(zhuǎn)換為Integer時(shí)Integer.valueOf("1010", 2)就只能轉(zhuǎn)正整數(shù),負(fù)數(shù)是無法轉(zhuǎn)換的。要想轉(zhuǎn)換二進(jìn)制為負(fù)數(shù),得用new BigInteger("二進(jìn)制字符串", 2).intValue();
我們都知道一個(gè)int有8個(gè)字節(jié),32位,但是最左邊的那個(gè)位置是用來表示正負(fù)符號的,也就是說Integer.MAX_VALUE所代表的值二進(jìn)制是:0111 1111 1111 1111 1111 1111 1111 1111而1111 1111 1111 1111 1111 1111 1111 1111代表的是-1。
位運(yùn)算
我們都知道移位運(yùn)算符有三個(gè):>> / << / >>> ;其中>>>叫做無符號右移,有什么區(qū)別?
Integer.toBinaryString(Integer.MAX_VALUE << 1);--> -2
正常情況下:左移右移的規(guī)則是左邊多的去掉,右邊多的也是去掉,右邊少的補(bǔ)0,負(fù)數(shù)左邊少了是補(bǔ)1,正數(shù)左邊少了是補(bǔ)0。所以有個(gè)無符號右移,為的就是這個(gè)。>>>無符號右移左邊缺了是不管正負(fù)數(shù)直接補(bǔ)0。
n &= n-1 會把n的二進(jìn)制最后一個(gè)1換成0,所以廣泛用于計(jì)算二進(jìn)制串有多少個(gè)1的算法