移位操作符和位操作符

移位操作符和位操作符
chenlei玩转C语言!从移位操作符和位操作符开始,让你的代码更加高效!」
@[TOC]
移位操作符、位操作符、二进制(C语言)
大家好,今天给大家带来的是移位操作符、位操作符、二进制详解。
(本章花费3.5小时,若对你有帮助,还请点个免费的赞)
我是黎明_CL,那接下来我们进入主题!
一、移位操作符
- “<<” 左移操作符
- “>>” 右移操作符
【核心:移位操作流程为:将数写为原码—>反码—>补码—移位—补码—>反码—>原码——数】 - 计算机能识别的是二进制信息 0 1
- 使用位移操作符对整型的二进制序列进行有效数位的左右移动;
移动的是计算机的二进制位,所以接下来我们先讨论整数的二进制表现形式:
首先先了解下二进制的相关知识
- 使用位移操作符对整型的二进制序列进行有效数位的左右移动;
1. 二进制知识补充
<1>二进制的书写:
由于我们熟悉10进制,所以我们根据10进制来学习二进制
- 10进制
每位都是有权重的,例如对于22:
<2>二进制码的三种表现形式:
- 原码
- 反码
- 补码——能被机器识别的
不管是正负都可以写出其原码,根据正负直接写出的二进制序列就是原码
- 正整数的原码、反码、补码是相同的
- 负整数的原码、反码、补码是要计算的:
- 反码符号位不变,其它位按位取反
- 补码=反码+1
接下来给大家举个例子:
1 | //正数 |
整数在内存中存储的是补码,计算时也使用补码
相信聪明的你一定学fei了。
2. 移位操作符
<1> “>>”
- 算数右移(右边丢弃,左边补原来的符号位)
- 逻辑右移(右边丢弃,左边直接补0)
接下来开始验证当前编译器是算数右移还是逻辑右移?
1 | int main() |
若当前编译器采用逻辑右移,即往首位补0,则以下结果应为负数;
因此可判断VS编译器为算数右移
对于以下结果,我们可以理解将正数右移一位可看为将其向下取整;但负数则不行。
<2> “<<”
- 相较于右移操作符,左移操作符更为简单,话不多说,我们直接上代码:
1 | int main() |
- 二进制
1 | //原码就是2进制,整形,4个字节,32比特位。正数原码,反码,补码相同。负数反码由原码的符号位不变,其他位按位取反得到,然后反码+1就是补码。整数在内存中存放的是补码,计算的也是补码 |
位操作符—也是操作二进制位
原码
反码
补码
二、位操作符(操作数必须为整数)
1. ‘ & ‘ 按位与
- 规则:对应(二进制)位 有0则为0,同时为1则为1;
- 代码如下:
1 | int main() |
- 结果测试正确
2. ‘ | ‘ 按位或
- 规则:对应(二进制)位有1则为1,两个同时位0则为0
- 代码如下:
1 | //按位或'|' |
- 结果测试正确
3. ‘ ^ ‘ 按位异或
- 规则:按(二进制)位异或 - 对应(二进制)位不同位1,相同为0;
- 特点: 异或具有交换律,证明如下:
1 | //a^a—>0 |
由此得出异或是支持交换率的
- 代码如下:
1 | int main() |
- 结果测试正确
三、应用
1. 不创建临时变量,实现两数交换
1 | int main() |
2. 求一个整数二进制数中1的个数
步骤如下:
- 整数有32个比特位
- 获取该数二进制的每一位
- 对该整数按位与1获取每一位(若不明白可返回上文查看按位与相关概念)
- 之后进行按位右移让二进制序列动起来
- 判断是否为1
- 是1则计数器+1
实现代码如下:
1 | //求一个整数二进制数中1的个数 |
感谢阅读!创作不易,如果觉得其中有能帮助到您,还请关注我,一起进步。
🚀Live long and Prosper!🖖🏼
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果






![![[Pasted image 20230512180206.png]]](https://i-blog.csdnimg.cn/blog_migrate/c629f1d6ff7c10f937e50c8511722134.png)









