补码,反码和位运算



首先总结位的简便计算:(以32位系统为例)

00000000 00000000 00000000    0 0  0  0 0 0  0  0

                              128 64 3216  8 4 2  1 (后八位总和是255

符:所有的位运算都是在补码的基础上进行的。(正数的补码反码都是它本身,一个数的补码的补码得到的是源码,计算机输出的是转换后的源码,但CPU进行位运算的是通过补码的形式计算的,求补码和反码时符号位不变。)

补码=反码+1

 

. &按位与:(相当于*;最高位也参与运算,都为11

1.eg5&3

1.)把53转换为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.)把-53转换为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.eg5|3

1.)把53转换为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.)把-53转换为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.eg5^3

1.)把53转换为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.)把-53转换为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

四.~按位取反(01,10

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.eg5 <<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位,就相当于乘以了2n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3

 

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

1.eg5 >>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.eg5> >>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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值