补码,反码和位运算
来源:互联网 发布:淘宝怎么搜苍蝇水 编辑:程序博客网 时间:2024/06/05 15:51
首先总结位的简便计算:(以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
- 补码,反码和位运算
- 位运算和原码,反码,补码
- PHP中位运算及原码,反码和补码
- 位运算符及原码、反码和补码
- c++位运算符 | & ^ ~ && ||,补码,反码
- 原码,补码,反码与位运算
- c++位运算符 | & ^ ~ && ||,补码,反码
- 正负数原码、反码、补码以及位运算
- 位运算以及原码反码补码的介绍和案例
- 原码反码补码和python中的按位运算易混点
- 补码,反码运算
- 位运算详解(原码<-->反码<-->补码)
- 二进制(原码,反码,补码),位运算原则:
- 原码补码反码以及位运算符
- 位运算——原码反码补码
- Java二进制,原码、反码、补码、位运算
- C语言之位运算/原码/反码/补码
- c语言的原码补码反码-位运算
- 上班一个月体会
- 【思维】uva11261Bishops
- JavaWeb开发常见乱码处理之设置编码方式
- 利用vsftpd拯救崩溃的Ubuntu虚拟机
- Codeforces Round #260 (Div. 1) A. Boredom
- 补码,反码和位运算
- 建立简单的哈希表
- Ubuntu 用户如何安装 Sublime Text 3文本编辑器
- poj 3468 A Simple Problem with Integers (线段树成段更新)
- 360 2015年在线笔试题:最后一个字符
- poj 1947 Rebuilding Roads 【树形DP】 【求至少删去树中 多少条边 使得树中节点数为P】
- hdu 3295 An interesting mobile game(bfs)
- 实现动态音量条
- 黑马程序员--封装--java