最近寫(xiě)了幾道位運(yùn)算的題目杖虾,順便復(fù)習(xí)一下位運(yùn)算的基本知識(shí)媒熊。
反碼:將二進(jìn)制的所有值取反,0變成1,1變成0
補(bǔ)碼:反碼加一
二進(jìn)制轉(zhuǎn)換
正常情況下嚷往,我們可以用Integer.toBinaryString()來(lái)獲取一個(gè)負(fù)數(shù)的二進(jìn)制字符串,但是將二進(jìn)制字符串轉(zhuǎn)換為Integer時(shí)Integer.valueOf("1010", 2)就只能轉(zhuǎn)正整數(shù)皮仁,負(fù)數(shù)是無(wú)法轉(zhuǎn)換的菲宴。要想轉(zhuǎn)換二進(jìn)制為負(fù)數(shù),得用new BigInteger("二進(jìn)制字符串", 2).intValue();
我們都知道一個(gè)int有8個(gè)字節(jié),32位喝峦,但是最左邊的那個(gè)位置是用來(lái)表示正負(fù)符號(hào)的,也就是說(shuō)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è):>> / << / >>> 闻丑;其中>>>叫做無(wú)符號(hào)右移勋颖,有什么區(qū)別?
Integer.toBinaryString(Integer.MAX_VALUE << 1);--> -2
正常情況下:左移右移的規(guī)則是左邊多的去掉饭玲,右邊多的也是去掉,右邊少的補(bǔ)0茄厘,負(fù)數(shù)左邊少了是補(bǔ)1,正數(shù)左邊少了是補(bǔ)0次哈。所以有個(gè)無(wú)符號(hào)右移,為的就是這個(gè)琼牧。>>>無(wú)符號(hào)右移左邊缺了是不管正負(fù)數(shù)直接補(bǔ)0。
n &= n-1 會(huì)把n的二進(jìn)制最后一個(gè)1換成0巨坊,所以廣泛用于計(jì)算二進(jìn)制串有多少個(gè)1的算法