当前位置:网站首页>位操作==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) )
边栏推荐
- 2020 Zhejiang Provincial Games
- golang select机制和超时问题怎么解决
- Database multi table Association query problem
- Lesson 1: hardness of eggs
- C socke server, client, UDP
- 农牧业未来发展蓝图--垂直农业+人造肉
- JS逆向教程第一发
- 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)
- Octopus future star won a reward of 250000 US dollars | Octopus accelerator 2022 summer entrepreneurship camp came to a successful conclusion
- PostgreSQL创建触发器的时候报错,
猜你喜欢
H5 web player easyplayer How does JS realize live video real-time recording?
面试被问到了解哪些开发模型?看这一篇就够了
VSCode+mingw64+cmake
EXT2 file system
Unity uses mesh to realize real-time point cloud (I)
[4G/5G/6G专题基础-147]: 6G总体愿景与潜在关键技术白皮书解读-2-6G发展的宏观驱动力
Use 3 in data modeling σ Eliminate outliers for data cleaning
第一讲:包含min函数的栈
Pit using BigDecimal
Sqlplus garbled code problem, find the solution
随机推荐
asp. How to call vb DLL function in net project
Gym - 102219J Kitchen Plates(暴力或拓扑序列)
The difference between viewpager2 and viewpager and the implementation of viewpager2 in the rotation chart
Lesson 1: hardness of eggs
Hcip first day notes sorting
JS逆向教程第一发
EXT2 file system
How to solve the problem of golang select mechanism and timeout
esp8266使用TF卡并读写数据(基于arduino)
牛客网——华为题库(61~70)
[4G/5G/6G专题基础-146]: 6G总体愿景与潜在关键技术白皮书解读-1-总体愿景
Create an int type array with a length of 6. The values of the array elements are required to be between 1-30 and are assigned randomly. At the same time, the values of the required elements are diffe
【frida实战】“一行”代码教你获取WeGame平台中所有的lua脚本
[4G/5G/6G专题基础-147]: 6G总体愿景与潜在关键技术白皮书解读-2-6G发展的宏观驱动力
How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
C# Socke 服务器,客户端,UDP
MySQL can connect locally through localhost or 127, but cannot connect through intranet IP (for example, Navicat connection reports an error of 1045 access denied for use...)
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)
Liunx command
大佬们,请问 MySQL-CDC 有什么办法将 upsert 消息转换为 append only 消