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