位運算------按位與、按位或、按位異或、取反、<<、>>、>>>


程序中的所有數在計算機內存中都是以二進制的形式儲存的,位運算就是直接對整數在內存中的二進制位進行操作。

知識點:

1、原碼、反碼、補碼(以byte的1、-1舉例)

示例                    1                      -1                                   

原碼        0000 0001          1000 0001     ------>第一位是符號位,0是正數,1為負數  

反碼        0000 0001          1111 1110       ------>正數反碼是其自身,負數則符號位不變,其他位置全部取反

補碼        0000 0001          1111 1111       ------->正數補碼是其自身,負數則為反碼+1

當然也可以從1通過取反,然后+1的方式得到-1的補碼

 

2、補碼:用於將十進制的負整數轉換為二進制數。十進制的正整數可以除以2取余,負整數則需要補碼。

      補碼的流程:例如-10

  10:0000 0000 0000 1010

    取反:1111 1111   1111  0101

                          +1

    -10:1111  1111  1111  0110

3、整數在內存中以補碼存在。

 

一、按位與(&)

定義:如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0.

示例:

1、10與-10 &運算

 10:0000 0000 0000 1010     ----->   十進制轉二進制

-10:1111  1111  1111  0110     ----->   -10就是10取反,然后+1(補碼)

結果: 0000 0000 0000 0010     ----->   結果為2

 

二、按位或(|)

定義:如果兩個相應的二進制位有一個為1,則該結果為1,否則為0.

示例:

1、10與-10 |運算

 10:0000 0000 0000 1010

-10:1111  1111  1111  0110

結果: 1111  1111 1111   1110  ----->結果-2

第一位為符號位,1代表是負數,因此是補碼形式存在,補碼-->十進制。先-1再取反(符號位不變),。

1000 0000 0000 0001

+1

1000 0000 0000 0010 ------> -2

 

三、按位異或(^)

定義:如果兩個相應的二進制位值不同則為1,否則為0

示例:

1、10與-10 ^運算

 10:0000 0000 0000 1010

-10:1111  1111  1111  0110

結果: 1111  1111 1111   1100  ------> 結果-4

 

四、取反(~)

定義:用來對一個二進制按位取反。

示例:

1、10取反

10:0000 0000 0000 1010

結果: 1111  1111 1111  0101 ------> 結果-11

 

五、左移(<<)

定義:將一個數的各二進制位全部左移N位,右補0

示例:

1、10左移<<2

10:0000 0000 0000 1010

結果: 0000 0000 0010 1000------> 結果40

 

六、右移(>>)

定義:將一個數的各二進制位全部右移N位,移到右邊的低位被舍棄,對於無符號數高位補0,負數高位補1.

1、10右移>>2

10:0000 0000 0000 1010

結果: 0000 0000 0000 0010------> 結果2

 

2、-10右移>>2

-10:1111  1111  1111  0110

結果: 1111  1111 1111   1101

      -1

          1111  1111 1111   1100

          取反,符號位不變

           1000 0000 0000 0011

結果:-3

 

七、>>>(無符號右移)

定義:將一個數的各二進制位全部右移N位,移到右邊的低位被舍棄,對於無符號數高位補0,只是對32位和64位的值有意義。

示例:

1、-10>>>2

-10:1111 1111 1111 1111 1111  1111  1111  0110  ------->由於>>>只對32和64位有意義,所以把-10定義成32位的

結果: 0011  1111 1111 1111 1111 1111 1111 1101

      -1

          0011  1111 1111 1111 1111 1111 1111 1100

             取反碼(符號位不變,正數反碼是其本身)

         0011  1111 1111 1111 1111 1111 1111 1100


免責聲明!

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



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