首先總結位的簡便計算:(以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