C语言位操作基础详解与实战
1、位与&
1)“位与”:& “逻辑与”:&&
2) 真值表:1&0 = 0 、0&1 = 0、0&0 = 0、1&1 = 1 只有当1与1位与时才是1,其他的值相与都是0
3)“位与”就是把2个十六进制的数先分别转换为二进制,然后再相与。“逻辑与”就是把2个十六进制分别看成2个整体,2个整体相与。
例子:0xA & 0xB = 0xA //位与 0xA && 0xB = 1 //逻辑与
0xA:1 0 1 0 0xA = 1 (ture)
0xB:1 0 1 1 0xB = 1 (ture)
位与: 1 0 1 0 逻辑与 : 1
2、位或|
1)“位或”:| “逻辑或”:||
2) 真值表:1|0 = 1 、0|1 = 1、0|0 = 0、1|1 = 1 只有两个0位或的时候才是0,其余的都是1
3) “位或”就是把2个十六进制的数先分别转换为二进制,然后再位或;“逻辑或”就是把2个十六进制分别看成2个整体,2个整体位或。
例子:0xA | 0xB = 0xB 0xA || 0xB = 1
0xA:1 0 1 0 0xA = 1 (ture)
0xB:1 0 1 1 0xB = 1 (ture)
位或: 1 0 1 1 逻辑或 : 1
3、位取反 ~
1)“位取反”:~ “逻辑取反”:!
2)“位取反”就是把十六进制数先转换为二进制,然后把每一位取反(1取反就变为0,0取反就为1);“逻辑取反”就是把十六进制数看成一个整体,然后取反(非0的数都是为真,逻辑取反后为假;0逻辑取反为真)。
3) 例子:0xA = 1 0 1 0 0xA (非0为真(即1))
~0xA = 0 1 0 1 = 0x5 !0xA = 0
~~0xA = 1 0 1 0 = 0xA !!0xA = 1
4、位异或 ^
1) “位异或”: ^
2) 真值表:1^0=1 0^1=1 0^0=0 1^1=0 两个数相等则为0,不相等则为1
3) 例子: 66 ^ 33 = 99
66: 1 0 0 0 0 1 0
33: 0 1 0 0 0 0 1
99: 1 1 0 0 0 1 1
代码: unsigned int a = 66, b = 33;
unsigned int c = a^b;
printf("c = %d ", c);
5、左移位<< 右移位>>
无符号数,左移时在右边补0,右移时在左边补0
二.位操作的实际应用
一般在操作寄存器的时候使用,如32位的arm寄存器,每个位代表的pin脚不同,效果也不同。有时候你只想改变某个pin脚的值从而实现某项功能,其余pin脚保持不变,就得使用位操作,只对目标位进行操作。操作的方式是:读->改->写。不要直接给寄存器赋目标值是因为你只知道要把目标位设置为某值,但是其他的位你并不知道原本是多少,所以要先读取这个寄存器的整体值,然后再修改其中的目标位,然后再把修改后的值写到寄存器。
1)特定位清零用&
譬如:将0xAAAAAAAA 的bit8 ~bit15清零,其他位保持不变。
分析:[位与]任何数(0/1)与1位与时为本身,与0位与为0,所以可以用位与的方式。
unsigned int a = 0xAAAAAAAA;
unsigned int b = 0xFFFF00FF;
unsigned int c;
c = a & b;
printf("c = 0x%x ", c); //c = 0xaaaa00aa
2)特定位 置1用 |
譬如:将0xffff00ff的bit8 ~bit15置1,其他位保持不变。
分析:位或 任何数(0/1)与1位或变为1,与0位或为本身
unsigned int a = 0xffff00ff;
unsigned int b = 0x000ff00;
unsigned int c;
c = a | b;
printf("c = 0x%x ", c); // = 0xffffffff
3)特定位取反用 ^
譬如:将0xffff00ff的bit8 ~bit15取反,其余保持不变
分析:位异或 任何数(0/1)与1位异或会取反,与0位异或为本身
unsigned int a = 0xffff00ff;
unsigned int b = 0xff00;
unsigned int c;
c = a ^ b;
printf("c = 0x%x ", c); // = 0xffffffff
三、特定二进制数的获取
由于上面示例中的unsigned int b的值太过于呆板,后续看代码的时候可能不知道为什么是这个值,所以需要以另外的方式来表达(主要是通过位移和位取反来获取这个特定的二进制数)。
(1) 譬如:unsigned int b = 0xff00; 中的0xff00
可表示为:0xFF<<8 (0xFF :8个二进制1 <<: 左移 8: 8位)
(2) 需要一个bit3 ~bit7,bit23~bit25为1的数(隐含意思是其他位都为0)
可为:0x1F<<3 | 0x7<<23
1F (7-3+1=5个1,转换为十六进制则为1F);
7 ( 25-23+1=3个1,转换为十六进制则为7)
| ( 位或,任何数与1位或都为1,与0位或为本身,所以这里用位或就相当于把这2个位移后的数叠加起来)
(3) 需要一个bit3 ~ bit7为0的数
可为:~(0x1F<<3)
总结:当需要的1比较少,需要的0比较多,就使用1位移的方式;当需要的0比较少,需要的1比较多,就使用位移然后取反的方式;当需要的数比较复杂,如bit3 ~bit7,bit23~bit25为1,就可以先位移然后位或的方式。
C语言位操作基础详解与实战相关推荐
- c 语言中 %是什么运算符,C 语言基础----详解C中的运算符
C语言中又有哪些运算符呢? 如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 C语言基本算术运算符如下表: 除法运算中注意: 如果相除的两个数都是整数的话,则 ...
- 视频教程-FPS游戏逆向与安全+UE4引擎基础详解-其他
FPS游戏逆向与安全+UE4引擎基础详解 想把自己的知识传播出去,让更多人学习到 苏瑞兵 ¥188.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取 ...
- 使用pickle保存机器学习模型详解及实战(pickle、joblib)
使用pickle保存机器学习模型详解及实战 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...
- AdaBoostClassifer详解及实战
AdaBoostClassifer详解及实战 AdaBoost算法是Adaptive Boost的简称,属于Boosting类算法. 随机森林是一种经典的Bagging算法. Boosting通过将一 ...
- c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战
本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...
- C语言再学习 -- 详解C++/C 面试题 2
(经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...
- 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战
关键词提取和文本摘要算法TextRank详解及实战 写在前面 最近一直没有更新文章,实在惭愧.伴随着小老弟的职业方向由风控转向了NLP,后面的文章也会集中在NLP领域,希望大家能够继续支持~ 导读 本 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- 【C语言】函数详解(入门到进阶)
目录 前言 一.什么是函数 二.函数的构成 三.函数的调用和声明 四.函数的参数 五.函数的递归 总结 写在后面 前言 最近帮家里的小朋友整理一些学习C语言的知识点 有整体入门基础文章--[C语言]拯 ...
最新文章
- 打开AD组策略编辑器提示“strings区段项目太长被截断”的解决
- 深入解读MySQL8.0 新特性 :Crash Safe DDL
- 上海2021年高考成绩排位查询,2021年上海各高中高考成绩排名及放榜最新消息
- ORA-12519: TNS: 没有找到适用的服务处理
- main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...
- C语言(CED)编写一个程序,求两个字符之间的加减运算。
- java if 顺序 括号_03-03 java 顺序语句结构,选择结构if语句
- java 课后习题 随机数统计
- JAVA 入门PDF
- 在函数中如何获取 线程对象、线程唯一ID
- 【BZOJ4260】Codechef REBXOR(前i个数的最大区间异或值---01字典树+dp)
- 创建CocoaPods的Framework Swift组件化之路(上)
- 开务正式加入中国信通院数据库应用创新实验室
- 电子信息工程专业实习手册周记_信息专业实习周记范文
- OkHttp3使用介绍
- sublime去掉空行 sublime批量删除空白行
- javascript英语单词音节拆分_英语单词音节的划分法
- Java并发之魂——synchronized深度解析
- HTTPSConnectionPool(host=‘***‘, port=443): Read timed out.
- 全能型Mac解压缩软件 MacZip2.0.1(41)中文版 原ezip
热门文章
- 如何在Android的就寝时间模式下夜间放松
- warning: format ‘%s’ expects argument of type ‘char *’和warning: backslash and newline separated by
- Linux shell for 循环
- 杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)
- 关于Android模块化开发介绍及使用
- 小米 ZigBee 设备接入 ThingsCloud 物联网平台实战
- css拖动音乐进度条,用css3绘制酷狗音乐闪烁的进度条
- 在Windows使用VSCode搭建嵌入式Linux开发环境
- TIP/Collision-Free Video Synopsis Incorporating Object Speed and Size Changes Code
- 洪君:vbs:仿抖音告白洪君