原码反码补码以及移位按位与或异或等位操作的实例

来源:互联网 发布:淘宝上的国大药房 编辑:程序博客网 时间:2024/05/22 16:44

实例全部来自C和指针课后习题,英文版p123 - 124可见

主要是看到bitwise以及shift运算,在做习题的过程中顺便复习了原码反码以及补码的运算,也清除了很多知识的盲点,比如一个二进制负数如何变成十进制等。

在32位的机器下,已知int a = 10, b = -25;求下列位运算。


a是正数,原码,反码,补码都一样
00000000 00000000 00000000 00001010


b是负数,最高位是符号位,反码是除符号位其他取反,补码是反码加1
原码
10000000 00000000 00000000 00011001
反码
11111111 11111111 11111111 11100110
补码
11111111 11111111 11111111 11100111
下面开始计算。


a << 2
00000000 00000000 00000000 00001010(a原来的值)
左移之后
00000000 00000000 00000000 00101000
转化成十进制为40


b >> 3
11111111 11111111 11111111 11100111(b原来的值)
右移之后
11111111 11111111 11111111 11111100
若要计算十进制,除了符号位其他取反结果再加1
取反的结果
10000000 00000000 00000000 00000011
加1
10000000 00000000 00000000 00000100
转化成十进制为-4


a & b
a   00000000 00000000 00000000 00001010
b   11111111 11111111 11111111 11100111
结果00000000 00000000 00000000 00000010
转化为十进制为2


a ^ b
a   00000000 00000000 00000000 00001010
b   11111111 11111111 11111111 11100111
结果11111111 11111111 11111111 11101101
若要计算十进制,除了符号位其他取反结果再加1
取反的结果
10000000 00000000 00000000 00010010
加1
10000000 00000000 00000000 00010011
转化成十进制为-19


a | b
a   00000000 00000000 00000000 00001010
b   11111111 11111111 11111111 11100111
结果11111111 11111111 11111111 11101111
若要计算十进制,除了符号位其他取反结果再加1
取反的结果
10000000 00000000 00000000 00010000
加1
10000000 00000000 00000000 00010001
转化成十进制为-17


~b
b   11111111 11111111 11111111 11100111
结果00000000 00000000 00000000 00011000
转化成十进制为24


b >> a - 4
由于- 优先级大于 >> 
b >> (10 - 4)
b   11111111 11111111 11111111 11100111
结果11111111 11111111 11111111 11111111
若要计算十进制,除了符号位其他取反结果再加1
取反的结果
10000000 00000000 00000000 00000000
加1
10000000 00000000 00000000 00000001
转化成十进制为-1


a & 0x1 == b & 0x1
由于 == 的优先级大于 &
a & 0 & 0x1 
结果为0


a | b << a & b
由于 << 的优先级大于 & 大于| (a =10,b = -25)
所以顺序为a | ((b << a) & b)
求法同上最后转化为十进制为-25590


0 0