0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中必须要掌握的位运算操作

汽车电子技术 来源:嵌入式之入坑笔记 作者: 嵌入式之入坑笔记 2023-02-10 14:19 次阅读

C语言中,特别是在嵌入式的开发中,位操作是很常用的一个知识点,涉及到按位(bit)操作的地方也是很常见的。本文分享一些C语言中的位操作运算的基础内容。

1、位与操作( & )

首先必须要区分位与(&)和逻辑与(&&),这两者之间看上去就是多一个少一个的区别,但是最终运算结果却是完全不同的。位与 & 的真值表:

pYYBAGPl4VmAedXFAAANBNq5WBA876.png

从上表可以看出,位与 & 的运算原则是:只有当参与运算的两个对象都是真(true 或 1)时,得到的运算结果才是 true 或 1 ,其它的都为flase 或 0。

位与 & 其实就是把参与运算的两个数先分别转换为二进制,然后再相与得到运算之后的结果,如下:

比如:0x01&0x03=0x01//运算如下:
0x01:0 0 0 1
0x03:0 0 1 1  
结果: 0 0 0 1

2、位或操作 ( | )

首先必须要区分位与(|)和逻辑与(||),这两者之间看上去就是多一个少一个的区别,但是最终运算结果却是完全不同的。位与 | 的真值表:

pYYBAGPl4WeAU8O9AAALyRcZCaI242.png

从上表可以看出,位与 | 的运算原则是:只要当参与运算的两个对象中有一个是真(true 或 1)时,得到的运算结果就是 true 或 1 ,只有两个都是 0 才为 flase 或 0。位与 | 其实就是把参与运算的两个数先分别转换为二进制,然后再相与得到运算之后的结果,如下:

比如:0x01 & 0x03 = 0x03   // 运算如下: 
0x01:0 0 0 1 
0x03:0 0 1 1
结果: 0 0 1 1

3、位取反操作(~)

位取反就是把十六进制数先转换为二进制,然后把对应的位取反(1 取反变为 0,0 取反变为1)。

比如:

比如:0x01 、 0x03  // 运算如下:
0x01:0 0 0 1        ~ 0x01:1 1 1 0   = 0x0D   

4、位异或操作( ^ )

位异或 ^ 的真值表:

pYYBAGPl4XeATPPQAAALgDXD2z0888.png

从上表可以看出,位异或 ^ 的运算原则是:当参与运算的两个对象中有一个是真(true 或 1)时,得到的运算结果就是 true 或 1 ;如果两个都是 0 就为 flase 或 0;两个都是 1 就为 flase 或 0。

总而言之就是:相同为0,不同为1。

比如:0x01 ^ 0x03 = 0x02   // 运算如下:
0x01:0 0 0 1
0x03:0 0 1 1
结果: 0 0 1 0 

5、位移操作(<< 、>>)

位移操作中,左移几位就在右边补几个0,右移几位就在左边补几个0,超出数值范围的部分则丢弃。如下:

poYBAGPl4YSAdsiIAAAfgPjHP7A547.png

6、位操作的实际运用

6.1、将特定位清零

如果想要把一个特定的数的某一个位清空(置零),使用位与 & 进行操作。比如:

pYYBAGPl4ZCAP9NTAAAjxJyHLHU136.png

6.2、将特定位置 1

如果想要把一个特定的数的某一个位清空(置零),使用位与 & 进行操作。比如:

poYBAGPl4ZqAPooeAAAjXd9ZosY196.png

6.3、特定位取反

如果想要把一个特定的数的某一个位取反,使用异或 ^ 进行操作。比如:

poYBAGPl4aeAGAssAAAfNQkHPzk279.png

注意:异或操作是相同为零,不同为1的运算原则!

6.4、获取特定二进制位

如果想要获取一个数中的某个或者某几个特定的二进制位,可以参考如下操作:

pYYBAGPl4bGAGc4jAAAxd1IqoKI814.png
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304772
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136680
  • bit
    bit
    +关注

    关注

    0

    文章

    48

    浏览量

    32008
收藏 人收藏

    评论

    相关推荐

    C语言基础知识(4)--运算

    C语言中运算符包括有算术运算符、关系运算符、逻辑运算符和
    的头像 发表于 06-15 09:38 3621次阅读

    C语言基础(7)--运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的。运算就是直接对整数在内存中的二进制进行操作C
    的头像 发表于 06-29 11:25 2990次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>基础(7)--<b class='flag-5'>位</b><b class='flag-5'>运算</b>

    C语言中运算的使用技巧

    程序中的所有数在计算机内存中都是以二进制的形式储存的。运算就是直接对整数在内存中的二进制进行操作
    发表于 08-10 09:17 464次阅读

    C语言中赋值运算符详解

    C语言中,赋值运算符用于将一个值赋给变量。
    发表于 08-18 16:38 1957次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>赋值<b class='flag-5'>运算</b>符详解

    在单片机C语言中如何对变量的某一进行操作或赋值?

    在单片机C语言中如何对变量的某一进行操作或赋值?
    发表于 04-07 14:47

    单片机的C语言中操作用法

    单片机的C语言中操作用法
    发表于 08-17 15:04

    C语言的几种操作运算

    在汇编语言中有直接对位进行操作的指令,如置、复位、取反、测试某一等,这对于硬件操作十分方便
    发表于 07-14 18:14

    C语言中三目运算符? :怎么使用?

    C语言中三目运算符? :怎么使用?
    发表于 11-02 09:23

    能不能在C语言中操作寄存器那样直接操作一个字节的单独一

       在C语言中通常操作只有真假两种状态的的数据时使用布尔bool变量比较多,如果需要同时观察多个状态,这时候选择操作效率会更高,用一个字
    发表于 02-25 06:13

    C语言操作有哪几种操作运算符呢

    C语言复习:一、操作:6种操作运算符二、define宏定义关键词define是
    发表于 02-25 06:00

    C/C++语言运算详解

    运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制的问题。C语言提供了6个
    发表于 12-14 16:36 4596次阅读

    C语言运算+实例讲解

    C语言运算有6种: &, | , ^(亦或), (右移)。 注意:参与运算的元素
    的头像 发表于 03-22 16:00 8602次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>位</b><b class='flag-5'>运算</b>+实例讲解

    C语言的几种操作运算程序详细说明

    在汇编语言中有直接对位进行操作的指令,如置、复位、取反、测试某一等,这对于硬件操作十分方便
    的头像 发表于 07-18 12:00 3059次阅读

    简单介绍嵌入式C语言中常用的操作

    在嵌入式C语言中,使用操作程序有很好的可读性。以下就简单介绍以下常用的操作
    的头像 发表于 02-23 10:36 1013次阅读

    C语言中什么是关系运算

    C语言中,比较符称为关系运算符,所谓关系运算就是比较运算,将两个数值进行比较,判断其比较的结果是否符合给的的条件。
    的头像 发表于 03-09 10:47 2423次阅读