一文搞懂C/C++中的位运算


前言

本文带领大家理解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种符号数的表示方法:

  1. 原码
  2. 反码
  3. 补码

具体的意义我就不过多阐述,大家只要知道有这3个符号数就行了。感兴趣的小伙伴可以看这里补码 原码 反码

下面我来带大家来使用这3种编码
注意:文中提到的符号位,即是2进制第一位数 1代表负数,0代表正数
原码:及对应数的二进制编码
正数的补码、反码都是其本身;负数的反码等于原码符号位不变,其余各位取反,负数的补码等于反码末尾加1

示例

求5 的按位取反码(~5),计算如下:

取原码:0000 01015的二进制编码)(因为是正数所以原码、反码、补码相同)

对其取反:1111 1010(符号位也要一同取反)

取反码:1000 0101(符号位不变,其余各位取反)

取补码:1000 0110(反码+1)
注意:该表达式为1000 0101+0000 0001二进制逢2进一

最终结果:1000 0110 换算成十进制,也就是-6(这里开头的1表示符号位,并不是代表计算的结果)

结果实现
在这里插入图片描述
可以看到我们计算的是正确的,那么你能自己独立计算出上边41883的补码吗??


总结

刚开始首先要理解好计算机中这3种符号数,清楚了如何计算,再来手动计算一次,加深自己的理解~~~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值