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语言位操作基础详解与实战相关推荐

  1. c 语言中 %是什么运算符,C 语言基础----详解C中的运算符

    C语言中又有哪些运算符呢? 如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 C语言基本算术运算符如下表: 除法运算中注意: 如果相除的两个数都是整数的话,则 ...

  2. 视频教程-FPS游戏逆向与安全+UE4引擎基础详解-其他

    FPS游戏逆向与安全+UE4引擎基础详解 想把自己的知识传播出去,让更多人学习到 苏瑞兵 ¥188.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取 ...

  3. 使用pickle保存机器学习模型详解及实战(pickle、joblib)

    使用pickle保存机器学习模型详解及实战 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...

  4. AdaBoostClassifer详解及实战

    AdaBoostClassifer详解及实战 AdaBoost算法是Adaptive Boost的简称,属于Boosting类算法. 随机森林是一种经典的Bagging算法. Boosting通过将一 ...

  5. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  6. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  7. 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战

    关键词提取和文本摘要算法TextRank详解及实战 写在前面 最近一直没有更新文章,实在惭愧.伴随着小老弟的职业方向由风控转向了NLP,后面的文章也会集中在NLP领域,希望大家能够继续支持~ 导读 本 ...

  8. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  9. 【C语言】函数详解(入门到进阶)

    目录 前言 一.什么是函数 二.函数的构成 三.函数的调用和声明 四.函数的参数 五.函数的递归 总结 写在后面 前言 最近帮家里的小朋友整理一些学习C语言的知识点 有整体入门基础文章--[C语言]拯 ...

最新文章

  1. 打开AD组策略编辑器提示“strings区段项目太长被截断”的解决
  2. 深入解读MySQL8.0 新特性 :Crash Safe DDL
  3. 上海2021年高考成绩排位查询,2021年上海各高中高考成绩排名及放榜最新消息
  4. ORA-12519: TNS: 没有找到适用的服务处理
  5. main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...
  6. C语言(CED)编写一个程序,求两个字符之间的加减运算。
  7. java if 顺序 括号_03-03 java 顺序语句结构,选择结构if语句
  8. java 课后习题 随机数统计
  9. JAVA 入门PDF
  10. 在函数中如何获取 线程对象、线程唯一ID
  11. 【BZOJ4260】Codechef REBXOR(前i个数的最大区间异或值---01字典树+dp)
  12. 创建CocoaPods的Framework Swift组件化之路(上)
  13. 开务正式加入中国信通院数据库应用创新实验室
  14. 电子信息工程专业实习手册周记_信息专业实习周记范文
  15. OkHttp3使用介绍
  16. sublime去掉空行 sublime批量删除空白行
  17. javascript英语单词音节拆分_英语单词音节的划分法
  18. Java并发之魂——synchronized深度解析
  19. HTTPSConnectionPool(host=‘***‘, port=443): Read timed out.
  20. 全能型Mac解压缩软件 MacZip2.0.1(41)中文版 原ezip

热门文章

  1. 如何在Android的就寝时间模式下夜间放松
  2. warning: format ‘%s’ expects argument of type ‘char *’和warning: backslash and newline separated by
  3. Linux shell for 循环
  4. 杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)
  5. 关于Android模块化开发介绍及使用
  6. 小米 ZigBee 设备接入 ThingsCloud 物联网平台实战
  7. css拖动音乐进度条,用css3绘制酷狗音乐闪烁的进度条
  8. 在Windows使用VSCode搭建嵌入式Linux开发环境
  9. TIP/Collision-Free Video Synopsis Incorporating Object Speed and Size Changes Code
  10. 洪君:vbs:仿抖音告白洪君