前言
本文带领大家理解C/C++中的位运算,为新手特地编写了补码的实现过程,本人能力有限,希望各位能在评论区对我的不足以及错误进行更正,谢谢大家!
一、位运算是什么?
众所周知,计算机内存都是以二进制的方式在内存中进行储存,而位运算,位运算就是直接对整数在内存中的二进制位进行操作。
二、在C/C++中位运算符
1.位运算符的种类
2.运算符计算方法
注意:给出的双目运算符都是由从右向左(从低位到高位对其)进行运算,并提供了口诀在后面供大家便于记忆
口诀:有假则假
口诀:有真则真
口诀:相同取0,不同取1
口诀:0 1互换
注意:这里仅代表取反运算。并不是按位取反运算!!!!切记!
三、位运算代码实现
#include<stdio.h>
int main()
{
int x = 41883;
printf("12与8的结果:%d\n", (12 & 8));
printf("4或8的结果:%d\n", (4 | 8));
printf("31异22的结果:%d\n", (31 ^ 22));
printf("x取反的结果:%d\n", ~x); //注意这里的是按位取反,并不是文章中单纯的0 1互换
return 0;
}
四、按位取反
要弄懂按位取反的方法,需要明白二进制数在内存中是以补码的方式存在的。
这时候有同学可能就有疑问了??补码究竟是什么????
这时候就不得不提计算机中的符号数值的表示方式了
计算机中一共有3种符号数的表示方法:
- 原码
- 反码
- 补码
具体的意义我就不过多阐述,大家只要知道有这3个符号数就行了。感兴趣的小伙伴可以看这里补码 原码 反码
下面我来带大家来使用这3种编码
注意:文中提到的符号位,即是2进制第一位数 1代表负数,0代表正数
原码:及对应数的二进制编码
正数的补码、反码都是其本身;负数的反码等于原码符号位不变,其余各位取反,负数的补码等于反码末尾加1
示例
求5 的按位取反码(~5),计算如下:
取原码:0000 0101(5的二进制编码)(因为是正数所以原码、反码、补码相同)
对其取反:1111 1010(符号位也要一同取反)
取反码:1000 0101(符号位不变,其余各位取反)
取补码:1000 0110(反码+1)
注意:该表达式为1000 0101+0000 0001二进制逢2进一
最终结果:1000 0110 换算成十进制,也就是-6(这里开头的1表示符号位,并不是代表计算的结果)
结果实现
可以看到我们计算的是正确的,那么你能自己独立计算出上边41883的补码吗??
总结
刚开始首先要理解好计算机中这3种符号数,清楚了如何计算,再来手动计算一次,加深自己的理解~~~