今天看了韩顺平老师的课程,讲到了位运算,觉得有点难度且非常有意思
首先规则如下:
运算规则如下:
例如:2&3=? ~-2=? ~2=? 2|3=? 2^3=?
(1):2&3=?
详细步骤如下:
2的原码 00000000 00000000 00000000 00000010
2的补码 00000000 00000000 00000000 00000010
3的原码 00000000 00000000 00000000 00000011
3的补码 00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000010
所以2&3=2;
(2):~-2=?
原码10000000 00000000 00000000 00000010
反码11111111 11111111 11111111 11111101
补码11111111 11111111 11111111 11111110
按位取反:0->1,1->0;
00000000 00000000 00000000 00000001
所以~-2=1
(3):~2=?
源码00000000 00000000 00000000 00000010
补码00000000 00000000 00000000 00000010
~按位取反 11111111 11111111 11111111 11111101
反码11111111 11111111 11111111 11111100
根据负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)得知
负数原码为:10000000 00000000 00000000 00000011
所以~2= -3
(4) 2|3=?
2的原码 00000000 00000000 00000000 00000010
3的原码 00000000 00000000 00000000 00000011
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
按位或|: 两位有一个为1,结果为1,否则为0(只要有一个为1,都为1)
具体如图:
补码运算结果左边第一位为0,为正数;正数的原码反码补码都一样
所以原码如下:
00000000 00000000 00000000 00000011
所以2|3=3
(5) 2^3=?
2的原码 00000000 00000000 00000000 00000010
3的原码 00000000 00000000 00000000 00000011
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
根据^规则为:两位一个为0,一个为1,结果为1,否则为0,
得到:00000000 00000000 00000000 00000010
所以2&3=2;