位运算------按位与、按位或、按位异或、取反、<<、>>、>>>

程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。

知识点:

1、补码:用于将十进制的负整数转换为二进制数。十进制的正整数可以除以2取余,负整数则需要补码。

      补码的流程:例如-10

  10:0000 0000 0000 1010

    取反:1111 1111   1111  0101

                          +1

    -10:1111  1111  1111  0110

2、负数在内存中以补码存在。

一、按位与(&)

定义:如果两个相应的二进制位都为1,则该位的结果值为1,否则为0.

示例:

1、10与-10 &运算

 10:0000 0000 0000 1010     ----->   十进制转二进制

-10:1111  1111  1111  0110     ----->   -10就是10取反,然后+1(补码)

结果: 0000 0000 0000 0010     ----->   结果为2

二、按位或(|)

定义:如果两个相应的二进制位有一个为1,则该结果为1,否则为0.

示例:

1、10与-10 |运算

 10:0000 0000 0000 1010

-10:1111  1111  1111  0110

结果: 1111  1111 1111   1110  ----->结果-2

第一位为符号位,1代表是负数,因此是补码形式存在,补码-->十进制。先取反(符号位不变),+1。

1000 0000 0000 0001

+1

1000 0000 0000 0010 ------> -2

三、按位异或(^)

定义:如果两个相应的二进制位值不同则为1,否则为0

示例:

1、10与-10 ^运算

 10:0000 0000 0000 1010

-10:1111  1111  1111  0110

结果: 1111  1111 1111   1100  ------> 结果-4

四、取反(~)

定义:用来对一个二进制按位取反。

示例:

1、10取反

10:0000 0000 0000 1010

结果: 1111  1111 1111  0101 ------> 结果-11

五、左移(<<)

定义:将一个数的各二进制位全部左移N位,右补0

示例:

1、10左移<<2

10:0000 0000 0000 1010

结果: 0000 0000 0010 1000------> 结果40

六、右移(>>)

定义:将一个数的各二进制位全部右移N位,移到右边的低位被舍弃,对于无符号数高位补0,负数高位补1.

1、10右移>>2

10:0000 0000 0000 1010

结果: 0000 0000 0000 0010------> 结果2

2、-10右移>>2

-10:1111  1111  1111  0110

结果: 1111  1111 1111   1101

          取反,符号位不变

          1000 0000 0000 0010

                    +1

           1000 0000 0000 0011

结果:-3

七、>>>(无符号右移)

定义:将一个数的各二进制位全部右移N位,移到右边的低位被舍弃,对于无符号数高位补0,只是对32位和64位的值有意义。

示例:

1、-10>>>2

-10:1111 1111 1111 1111 1111  1111  1111  0110  ------->由于>>>只对32和64位有意义,所以把-10定义成32位的

结果: 0011  1111 1111 1111 1111 1111 1111 1101

             取反(符号位不变)

         0100 0000 0000 0000 0000 0000 0000 0010

                    +1

         0100 0000 0000 0000 0000 0000 0000 0011

猜你喜欢

转载自www.cnblogs.com/alimayun/p/10693358.html