天天看點

補碼,反碼和位運算



首先總結位的簡便計算:(以32位系統為例)

00000000 00000000 00000000    0 0  0  0 0 0  0  0

                              128 64 3216  8 4 2  1 (後八位總和是255)

符:所有的位運算都是在補碼的基礎上進行的。(正數的補碼反碼都是它本身,一個數的補碼的補碼得到的是源碼,計算機輸出的是轉換後的源碼,但CPU進行位運算的是通過補碼的形式計算的,求補碼和反碼時符号位不變。)

補碼=反碼+1;

一. &按位與:(相當于*;最高位也參與運算,都為1則1)

1.eg:5&3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

       00000000  00000000 00000000 00000001     

5&3的結果:1

2.eg:-5&3首先總結位的簡便計算:(以32位系統為例)

00000000 00000000 00000000 0 0 0 0 0 0 0 0

128 64 32 16 8 4 2 1 (後八位總和是255)

符:所有的位運算都是在補碼的基礎上進行的。(正數的補碼反碼都是它本身,一個數的補碼的補碼得到的是源碼,計算機輸出的是轉換後的源碼,但CPU進行位運算的是通過補碼的形式計算的,求補碼和反碼時符号位不變。)

補碼=反碼+1;

首先總結位的簡便計算:(以32位系統為例)

00000000 00000000 00000000 0 0 0 0 0 0 0 0

128 64 32 16 8 4 2 1 (後八位總和是255)

符:所有的位運算都是在補碼的基礎上進行的。(正數的補碼反碼都是它本身,一個數的補碼的補碼得到的是源碼,計算機輸出的是轉換後的源碼,但CPU進行位運算的是通過補碼的形式計算的,求補碼和反碼時符号位不變。)

補碼=反碼+1;

一. & 按位與:(相當于*;最高位也參與運算,都為1則1)

1.eg:5&3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

00000000 00000000 00000000 00000001

5&3的結果:1

2.eg:-5&3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

00000000 00000000 00000000 00000011

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000011

即:-5&3的結果:3

二. | 按位或:(相當于+;最高位也參與運算,都為0則0)

1.eg:5|3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

00000000 00000000 00000000 00000111

即:5|3的結果:1+2+4=7

2.eg:-5|3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

10000000 00000000 00000000 00000111

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到 | 運算結果(還是補碼)

11111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000101

即:-5|3的結果:-5

三.^按位異或(相同為0,不同為1)

1.eg:5^3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到^運算結果(還是補碼)

00000000 00000000 00000000 00000110(正數的補碼是它本身)

即:5^3的結果:2+4=6

2.eg:-5^3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

10000000 00000000 00000000 00000111

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到 ^ 運算結果(還是補碼)

11111111 11111111 11111111 11111000

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00001000

即:-5^3的結果:-8

四.~按位取反(0變1,1變0)

1.eg:~5

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 ~ 運算結果(還是補碼)

11111111 11111111 11111111 11111010

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000110

即:~5的結果:-6

2.eg:~-5

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000101

即:~-5的結果:-5

五.<<左移(右側空位補0)

1.eg:5 <<2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5<<2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

00000000 00000000 00000000 0000010100(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

000000 00000000 00000000 0000010100

即:5<<2的結果:20

2.eg:-5<<2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5<<2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

1111111111 11111111 11111111 11101100

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00010100

即:-5<<2的結果:-20

8、用最有效率的方法算出2乘以8等於幾?

2 << 3,

因為将一個數左移n位,就相當于乘以了2的n次方,那麼,一個數乘以8隻要将其左移3位即可,而位運算cpu直接支援的,效率最高,是以,2乘以8等於幾的最效率的方法是2 << 3。

六.>>右移 (左側空位補最高位,即符号位)

1.eg:5 >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5>>2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

0000000000 00000000 00000000 00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000001

即:5>>2的結果:1

2.eg:-5>>2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5>>2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

1111111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000010

即:-5>>2的結果:-2

七.>>>無符号右移(左側空位補0)

1.eg:5> >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5>>>2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

0000000000 00000000 00000000 00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000001

即:5>>>2的結果:1

2.eg:-5>>>2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5>>>2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

0011111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

00111111 11111111 11111111 11111110(正數的補碼是它本身)

即:-5>>>2的結果:1073741822

一. & 按位與:(相當于*;最高位也參與運算,都為1則1)

1.eg:5&3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

00000000 00000000 00000000 00000001

5&3的結果:1

2.eg:-5&3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

00000000 00000000 00000000 00000011

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000011

即:-5&3的結果:3

二. | 按位或:(相當于+;最高位也參與運算,都為0則0)

1.eg:5|3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

00000000 00000000 00000000 00000111

即:5|3的結果:1+2+4=7

2.eg:-5|3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

10000000 00000000 00000000 00000111

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到 | 運算結果(還是補碼)

11111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000101

即:-5|3的結果:-5

三.^按位異或(相同為0,不同為1)

1.eg:5^3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到^運算結果(還是補碼)

00000000 00000000 00000000 00000110(正數的補碼是它本身)

即:5^3的結果:2+4=6

2.eg:-5^3

(2.)把-5和3轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

3---------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

10000000 00000000 00000000 00000111

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

3--------- 00000000 00000000 00000000 00000011(正數的補碼是它本身)

得到 ^ 運算結果(還是補碼)

11111111 11111111 11111111 11111000

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00001000

即:-5^3的結果:-8

四.~按位取反(0變1,1變0)

1.eg:~5

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 ~ 運算結果(還是補碼)

11111111 11111111 11111111 11111010

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000110

即:~5的結果:-6

2.eg:~-5

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000101

即:~-5的結果:-5

五.<<左移(右側空位補0)

1.eg:5 <<2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5<<2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

00000000 00000000 00000000 0000010100(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

000000 00000000 00000000 0000010100

即:5<<2的結果:20

2.eg:-5<<2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5<<2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

1111111111 11111111 11111111 11101100

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00010100

即:-5<<2的結果:-20

8、用最有效率的方法算出2乘以8等於幾?

2 << 3,

因為将一個數左移n位,就相當于乘以了2的n次方,那麼,一個數乘以8隻要将其左移3位即可,而位運算cpu直接支援的,效率最高,是以,2乘以8等於幾的最效率的方法是2 << 3。

六.>>右移 (左側空位補最高位,即符号位)

1.eg:5 >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5>>2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

0000000000 00000000 00000000 00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000001

即:5>>2的結果:1

2.eg:-5>>2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5>>2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

1111111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

10000000 00000000 00000000 00000010

即:-5>>2的結果:-2

七.>>>無符号右移(左側空位補0)

1.eg:5> >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000 00000101(正數的補碼是它本身)

得到 5>>>2 運算結果(還是補碼)

00000000 00000000 00000000 00000101

0000000000 00000000 00000000 00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

00000000 00000000 00000000 00000001

即:5>>>2的結果:1

2.eg:-5>>>2

(2.)把-5轉換為2進制;

-5--------- 10000000 00000000 00000000 00000101

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111010

-5的補碼(符号位不變):

-5--------- 11111111 11111111 11111111 11111011

得到-5>>>2的運算結果(還是補碼):

11111111 11111111 11111111 11111011

0011111111 11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

00111111 11111111 11111111 11111110(正數的補碼是它本身)

即:-5>>>2的結果:1073741822

(2.)把-5和3轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

3--------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

         00000000 00000000 00000000  00000011

由結果得源碼(即補碼的補碼):

         00000000  00000000 00000000 00000011

即:-5&3的結果:3

二. | 按位或:(相當于+;最高位也參與運算,都為0則0)

1.eg:5|3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

得到&運算結果(還是補碼)

         00000000 00000000 00000000  00000111     

即:5|3的結果:1+2+4=7

2.eg:-5|3

(2.)把-5和3轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

         10000000  00000000 00000000 00000111     

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

3--------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

得到 |運算結果(還是補碼)

          11111111  11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00000101

即:-5|3的結果:-5

三.^按位異或(相同為0,不同為1)

1.eg:5^3

(1.)把5和3轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

得到^運算結果(還是補碼)

         00000000  00000000 00000000 00000110(正數的補碼是它本身)    

即:5^3的結果:2+4=6

2.eg:-5^3

(2.)把-5和3轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101

3---------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

         10000000  00000000 00000000 00000111     

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

3--------- 00000000 00000000 00000000  00000011(正數的補碼是它本身)

得到 ^運算結果(還是補碼)

          11111111  11111111 11111111 11111000

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00001000

即:-5^3的結果:-8

四.~按位取反(0變1,1變0)

1.eg:~5

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

得到 ~運算結果(還是補碼)

         11111111  11111111 11111111 11111010

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00000110

即:~5的結果:-6

2.eg:~-5

(2.)把-5轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101    

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00000101

即:~-5的結果:-5

五.<<左移(右側空位補0)

1.eg:5 <<2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

得到5<<2 運算結果(還是補碼)

           00000000 00000000 00000000  00000101

00000000 00000000  00000000  0000010100(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

           000000  00000000  00000000  0000010100

         即:5<<2的結果:20

2.eg:-5<<2

(2.)把-5轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101    

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

得到-5<<2的運算結果(還是補碼):

         11111111  11111111 11111111 11111011

       1111111111 11111111 11111111  11101100

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00010100

即:-5<<2的結果:-20

用最有效率的方法算出2乘以8等於幾?

2 << 3,

因為将一個數左移n位,就相當于乘以了2的n次方,那麼,一個數乘以8隻要将其左移3位即可,而位運算cpu直接支援的,效率最高,是以,2乘以8等於幾的最效率的方法是2 << 3。

六.>>右移(左側空位補最高位,即符号位)

1.eg:5 >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

得到 5>>2運算結果(還是補碼)

         00000000 00000000 00000000  00000101

0000000000 00000000  00000000  00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

         00000000  00000000 00000000  00000001

         即:5>>2的結果:1

2.eg:-5>>2

(2.)把-5轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101    

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

得到-5>>2的運算結果(還是補碼):

         11111111  11111111 11111111 11111011

         1111111111 11111111 11111111  11111011

由結果得源碼(即補碼的補碼):

         10000000  00000000 00000000 00000010

即:-5>>2的結果:-2

七.>>>無符号右移(左側空位補0)

1.eg:5> >>2

(1.)把5轉換為2進制;

5---------- 00000000 00000000 00000000  00000101(正數的補碼是它本身)

得到 5>>>2運算結果(還是補碼)

         00000000  00000000 00000000 00000101

0000000000 00000000  00000000  00000101(正數的補碼是它本身)

由結果得源碼(即補碼的補碼):

         00000000  00000000 00000000  00000001

         即:5>>>2的結果:1

2.eg:-5>>>2

(2.)把-5轉換為2進制;

 -5--------- 10000000  00000000 00000000 00000101    

-5的反碼(符号位不變):

-5--------- 11111111 11111111 11111111  11111010

-5的補碼(符号位不變):

 -5--------- 11111111  11111111 11111111 11111011

得到-5>>>2的運算結果(還是補碼):

         11111111  11111111 11111111 11111011

         0011111111 11111111 11111111  11111011

由結果得源碼(即補碼的補碼):

00111111 11111111 11111111  11111110(正數的補碼是它本身)

即:-5>>>2的結果:1073741822

繼續閱讀