二進制操作, ~按位取反, | 或, & 與, ^異或, >倍數


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM