原码、补码、反码以及位运算

原码、补码、反码的概念以及位运算

1 原码、补码、反码

1.1 原码组成

机器数是一个数在计算机中的二进制表示形式,机器数是带符号的,在计算机中用一个数的最高位(第一位)存放符号, 正数为0, 负数为1。例如1(带符号即+1)在计算机中的最终表示形式为 0000 0001,依此类推-1的二进制为 1000 0001。这种表示方式又叫做原码,其中0的原码为0000 0000。
注:为什么 10000 0001 而不是 0001,在计算机中最小的存储单位是字节,1个字节占8位

1.2 反码

如果是正数,反码和原码是一样的,也就是1的原码是0000 0001,它的反码也是0000 0001.

如果是负数,反码就是在原码的基础上保持符号位不变,其它依次取反,因为-1的原码是 1000 0001,所以它的反码是 1111 1110

1.3 补码

如果是正数,补码和原码是一样的,也就是1的原码是0000 0001,它的补码也是0000 0001.

如果是负数,补码就是在反码的基础上加1,因为-1的原码是 1000 0001,它的反码是 1111 1110,所示它的补码是1111 1111。

1.4 总结

正数的原码、反码、补码都是一样的。

0的原码、反码、补码都是0000 0000。

负数的反码符号位表示符号的值不变,其它取反,补码在反码基础上加1。
注:计算机中的运算都是以补码的形式参与运算的!!!!!

2 位运算

计算机中的运算都是以补码的形式参与运算的!

2.1 按位与&

按位与运算规则是:相同位都为1,则为1,否则为0。
举个例子:

例1:计算1&3的值是多少?
1的原码是0000 0001,补码为0000 0001
3的原码是 0000 0011,补码为0000 0011
通过上面的规则只有最后一位都是1(补码参与运算,后同),所以最后的结果是 0000 0001,原码也是0000 0001,也就是1,即1&3=1。
我们通过代码展示:

func main() {
	a, b := 1, 3
	println(a & b)
}

程序最终输出结果是1。

例2:计算-1&3的值是多少?
-1原码是1000 0001,反码是1111 1110,补码是1111 1111。3的原码、反码、补码都是0000 0011。由于最后两个都是1,所以结果是 0000 0011,原码也是0000 0011,即为3。

2.2 按位或|

按位或的运算规则是:只要有一个为1,则为1,否则为0。
举例:
例1:1|3结果是多少?
1的补码是0000 0001,3的补码是0000 0011,所示结果为0000 0011,原码为0000 0011,即为3。
代码:

func main() {
	a, b := 1, 3
	println(a | b)
}

例2:-1|3的结果是多少?
-1的补码是:1111 1111,3的补码是 0000 0011,所以结果是为1111 1111,原码为1000 0001,即为-1。

2.3 按位异或^

按位异或的规则是:相同位相同则为0,不同则为1.
举例:
例1:1^3是多少?
1的补码是0000 0001,3的补码是0000 0011,结果是0000 0010,对应的原码是0000 0010,即为2。
例2:-1^3的结果是多少?
-1的补码是:1111 1111,3的补码是 0000 0011,所以结果是为1111 1100,原码为1000 0100,即为-4。

2.4 右移运算>>

右移运算的规则是:低位(0)补齐,用符号位补移出的高位(1)。
举例:
例1:1>>5是多少?
1的补码是0000 0001,右移5后为,0000 0000,符号位是0,补最后一个1,结果还是 0000 0000,即0。
例2:3>>1是多少?
3的补码是0000 0011,右移1后为,0000 0001,符号位是0,补倒数第二个1,结果是 0000 0001,即1。

2.5 左移运算<<

左移运算的规则是:符号位不变
举例:
例1:-1<<5是多少?
-1的补码是1111 1111,左移5是1110 0000,补码是1101 1111原码是1010 0000,即-32。
例2:3<<1是多少?
3的补码是0000 0011,左移1后为是0000 0110,原码是 0000 0110,即6。
例3:3<<6是多少?
3的补码是0000 0011,左移1后为是0000 1100 0000,原码是 0000 1100 0000,即192。

发布了78 篇原创文章 · 获赞 58 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq122516902/article/details/89605394