天天看点

补码,反码和位运算



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

继续阅读