当前位置:网站首页>位操作==c语言2
位操作==c语言2
2022-07-07 07:10:00 【栋哥修炼日记】
一、位操作符
1、位与&
- 注意:位与&,逻辑&&。
举例0xAA&0xF0=0xA0,0xAA && 0xF0=1
2、位或|
- 注意:位或是|,逻辑或是||
3、位取反~
- 注意:C语言中位取反是~,逻辑取反是!。
4、位异或^
- 0或1与1位异或就会取反,0或1与0位异或则不变、
5、位左移、位右移
- 对于无符号数:
- 左移时右侧补0,相当于逻辑移位。
- 右移时左侧补0,相当于逻辑移位。
- 对于有符号数:
- 左移时右侧补0,叫算术移位,相当于逻辑移位。
- 有右移时左侧补符号位,正数补0负数补1,叫算术移位。
- 嵌入式中使用的移位都是无符号数移位。
二、&,|,^在操作寄存器时的特殊作用
1、寄存器的操作要求
- ARM是内存与IO统一编制的(x86则不是),读写寄存器就是操控硬件。
- 如何做到设定特定位时不影响其它位?
答案是:读-改-写三部曲。
2、特定位清零用&
3、特定位置1用|
4、特定位取反用^
三、如何用位运算构建特定二进制数
1、寄存器操作经常需要特定位给特定值(“改”的过程中)
- 解法1:用工具软件或自己大脑计算,直接给出32位特定数
- 解法2:自己写代码用位操作符号来构建
2、使用移位获取特定位为1的二进制数
- 譬如需要一个bit3~bit7为1的二进制数:(0x1f << 3)。
- bit3 ~ bit7为1,同时bit23 ~ 25也为1:((0x1f << 3) | (7 << 23))。
3、结合取反获取特定位为0二进制数
- 获取bit4 ~ bit10为0,其余为1的数:~(0x7f << 4)
4、总结:“改”的过程用&、|、^结合特定二进制数即可完成
四、位运算实战演练
1、给定一个整形数a,取出a的bit3~bit8
- 第一步:a &= (0x3f << 3);
- 第二步:a >>= 3;
2、给定一个整形数a,给a的bit7~bit17赋值937
- 第一步:a &= ~(0x7ff << 7); // 特定位置0
- 第二步:a |= (937 << 7); // 特定位赋值
3、给定一个整形数a,给a的bit7~bit17中的值加17
- 第一步:b = a & (0x7ff << 7); b >>= 7; // 取出该值
- 第二步:b += 17; // 加上17
- 第三步:a &= ~(0x7ff << 7); // 特定位清0
- 第四步:a |= (b << 7); // 特定位赋值
五、技术升级:用宏定义来完成位运算
1、直接用宏定义来置位、复位
- #define SET_NTH_BIT(x,n) ((x) |= ((1U)<<(n)))
- #define CLEAR_NTH_BIT(x,n) ((x) &=~((1U)<<(n)))
2、用宏定义来截取变量的部分连续位,
- 例如截取变量0x88(10001000b)的bit2~bit4
- #define GRTBITS(x,n,m) ( ( (x) & ~( ~(0U) << ((m) – (n) + 1)) ) << (n) ) >> (n) )
边栏推荐
- Basic chapter: take you through notes
- 如何使用clipboard.js库实现复制剪切功能
- 小程序弹出半角遮罩层
- 【frida实战】“一行”代码教你获取WeGame平台中所有的lua脚本
- nlohmann json
- Oracle installation enhancements error
- Diffusion模型详解
- Qualifying 3
- How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
- Dynamics 365Online ApplicationUser创建方式变更
猜你喜欢
Applet sliding, clicking and switching simple UI
Unity shader (basic concept)
面试被问到了解哪些开发模型?看这一篇就够了
In fact, it's very simple. It teaches you to easily realize the cool data visualization big screen
H5网页播放器EasyPlayer.js如何实现直播视频实时录像?
如何使用clipboard.js库实现复制剪切功能
MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
印象笔记终于支持默认markdown预览模式
js逆向教程第二发-猿人学第一题
Use 3 in data modeling σ Eliminate outliers for data cleaning
随机推荐
第一讲:鸡蛋的硬度
Gym - 102219J Kitchen Plates(暴力或拓扑序列)
CentOS installs JDK1.8 and mysql5 and 8 (the same command 58 in the second installation mode is common, opening access rights and changing passwords)
Esp8266 uses TF card and reads and writes data (based on Arduino)
如何成为一名高级数字 IC 设计工程师(5-2)理论篇:ULP 低功耗设计技术精讲(上)
细说Mysql MVCC多版本控制
用flinksql的方式 写进 sr的表,发现需要删除的数据没有删除,参照文档https://do
How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
Impression notes finally support the default markdown preview mode
Difference between process and thread
有没有大佬帮忙看看这个报错,有啥排查思路,oracle cdc 2.2.1 flink 1.14.4
PostgreSQL reports an error when creating a trigger,
js逆向教程第二发-猿人学第一题
小程序滑动、点击切换简洁UI
Basic use of JMeter to proficiency (I) creation and testing of the first task thread from installation
Niuke - Huawei question bank (61~70)
Loxodonframework quick start
How to become a senior digital IC Design Engineer (1-6) Verilog coding Grammar: Classic Digital IC Design
农牧业未来发展蓝图--垂直农业+人造肉
Hcip first day notes sorting