1.按位與:
兩個位都為1時,結果才為1
&1 判斷奇偶。
eg1:
xxx&1 === 1,xxx為奇數;xxx&1 ===0,xxx為偶數。
也可以用取模的方式 xxx%2 ===1 奇數, xxx%2 === 0 偶數
1的末位是1,其余是0 ,只有奇數&1才為1。
eg2:
xxx為1, xxx & (xxx-1) === 0
&是只有都為1 才為1,否則為0。所以都是0。
0&-1 2&1 4&3 6&5 =>4 => 所以說偶數 & (偶數-1)不一定為0,奇數 & (奇數-1)也不為0.
2.按位取反:
~[1,2,3].indexOf(1)
判斷是否在這個數組中,在數組中。返回-1,-2,-3...。沒在數組中返回0。
所有正整數的按位取反是其本身+1的負數
所有負整數的按位取反是其本身+1的絕對值
零的按位取反是 -1
二進制數在內存中是以補碼的形式存放的。
另外正數和負數的補碼不一樣,正數的補碼、反碼都是其本身,既:
正數9:
原碼為: 0000 1001
補碼為: 0000 1001
反碼為: 0000 1001
再例如: -2
求原碼: 1111 0010 (前面4個1表示符號位)
求反碼: 1111 1101 (符號位不變,其余各位求反)
求補碼: 1111 1110 (符號位不變,末位+1)
所以-2在內存中存放為: 1111 1110
假設要對正數9按位取反——> (~9),計算步驟如下,
原碼為 0000 1001,
反碼為 0000 1001,
補碼為 0000 1001,
對其取反 1111 0110(符號位一起進行取反,這不是反碼更加不是最終結果,只是補碼的取反僅此而已)
我們還需要把他轉換成原碼,因為是負數所以進行負數補碼到原碼的逆運算
先減1得反碼: 1111 0101
取反得原碼:1111 1010,(反碼和原碼是一個相對的概念,對反碼取反就是原碼。取反過程符號位是不變的哦)
前面4個1是符號位,1是負數,既得十進制:-10
3. 按位取 | :
兩個位都為0時,結果才為0
小數取整
eg:
5.1 | 0 => 5
5.5 | 0 =>5
5.9 | 0 =>5
4. ~~ 兩個連續的按位取反運算,取整:
~~5.1 => 5
~~5.5 =>5
最后一個有趣的事實是:
1. 所有正整數的按位取反是其本身+1的負數
2. 所有負整數的按位取反是其本身+1的絕對值
3. 零的按位取反是 -1(0在數學界既不是正數也不是負數)。
3. 擴大倍數
1>>1 => 0 , 縮小2 = 2^1倍
2>>1 =>1, 縮小2 = 2^1倍
4>>2 =>1, 縮小4= 2^2倍
1<<1 => 2, 擴大2 = 2^1 倍
1<<2 => 4, 擴大4 = 2^2 倍
參考連接:
原文鏈接:https://blog.csdn.net/xiexievv/java/article/details/8124108