首先总结位的简便计算:(以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