18 位运算

1,原码,反码,补码

  ①二进制的最高位是符号位,0代表正数,1表示负数

  ②正数的原码,反码,补码都一样

  ③负数的反码=它的原码符号位不变,其他位取反(1->0  0>1)

  ④负数的补码=它的反码+1

  ⑤计算机运算的时候,都是以补码的方式来运算的

2,位运算符

  

 

 

 3,C语言位运算规则

  ① 按位与 & :  两位全为1,结果为1,否则为0

  ② 按位或 | :两位有一个为1,结果为1,否则为0

  ③ 按位异或 ^ :两位一个为0,一个为1,结果为1,否则为0

  ④ 按位取反 ~:0  --  1   1-- 0

4,  求 ~2

  步骤:

  ①求出2的补码

  ②将2的补码取反

  ③取反后的补码变为原码

  求解:

    ①2是正数(4个字节),2的补码就是2的原码,所以2的补码是:

      00000000  00000000  00000000  00000010

    ②2的补码取反,得到

      11111111  11111111  11111111  11111101

    ③取反后得到的补码符号位是1,说明是负数,求负数的原码,需要先求出反码(补码-1)

      11111111  11111111  11111111  11111100

      再求出原码(符号位不变,其他位按位取反)

      10000000  00000000  00000000  00000011  =》-3

    ④得 2 按位取反的结果为 -3  

5,求 2& -3

    步骤

    ①求出2的补码

    ②求出-3的补码

    ③将2的补码和3的补码按位与运算

    ④将运算后的补码变成原码

    求解

      ①2是正数,补码等于原码,为,

        00000000  00000000  00000000  00000010

      ②-3是负数,求负数的补码,需要先通过原码求出反码,

        原码:10000000  00000000  00000000  00000011

        反码:11111111  11111111  11111111  11111100

        补码:11111111  11111111  11111111  11111101

      ③两补码按位与运算:

        00000000  00000000  00000000  00000010

        11111111  11111111  11111111  11111101

       =》00000000  00000000  00000000  000000000

       =》0

      ④得到结果为0

6,算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位

   1 >>2    ====   1/2/2=0

   -1 >> 2  === -1

    求解 -1 >>2

    步骤:①求出 -1 的补码

       ②将-1的补码右移2位

          ③ 将右移后的补码转为原码

    求解:

      ① -1 是负数,先得到原码,

        10000000  00000000  00000000 00000001

        再得到反码,

        11111111  11111111  11111111  11111110

        得到补码:

        11111111  11111111  11111111  11111111

      ② 右移2位

        11111111  11111111  11111111  11111111

      ③上面的补码告诉我们这是一个负数,需要先求出反码,

        10000000  00000000  00000000  00000000

         原码:(反码+1)

        10000000  00000000  00000000  00000001 =》 -1

7,算术左移 << : 符号位不变,低位补0

    c=1 << 2   ==== 1*2*2 =4

 

posted @ 2020-02-21 21:17  shanlu  阅读(214)  评论(0编辑  收藏  举报