你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

位操作的优势

[复制链接]
ctang 发布时间:2017-9-20 15:27
本帖最后由 ctang 于 2017-9-20 15:27 编辑

位操作的优势

在C语言中,可以单独操控变量中的位。读者可能好奇,竟然有人想这样做。有时必须单独操控位,而且非常有用。

例如,通常向硬件设备发送一两个字节来控制这些设备,其中每个位bit都有特定的含义。另外,与文件相关的操作系统信息经常被储存,通过使用特定位表明特定项。许多压缩和加密操作都是直接处理单独的位。

高级语言一般不会处理这级别的细节。C在提供高级语言便利的同时,还能在为汇编语言所保留的级别上工作,这使其成为编写设备驱动程序和嵌入式代码的首选语言。

位操作的基本运算

反码或按位取反:~

一元运算符~把1变为0,把0变为1.

~(10011010)=(01100101)

按位与:&

相应位都为1时,结果才为1.

(10010011)&(00111101)=(00010001)

按位或:|

相应位只要有1,结果就为1.

(10010011)|(00111101)=(10111111)

按位异或:^

相应位不一样,结果就为1.

(10010011)^(00111101)=(10101110)

位操作的高级运算

掩码

**按位与&**运算符常用于掩码(mask)。所谓掩码指的是一些设置为开(1)或关(0)的位组合。

假设定义符号常量MASK为2,那么

    flags = flags & MASK

可以这样类比:把掩码中的0看作不透明,1看作透明。这样flag & MASK的结果只有MASK为1的位才可见。

![]()


下面这条语句是按位与的一种常见用法:

    ch &= 0xff;

这个掩码保持ch中最后8位不变,其他位都设置为0.

打开位(设置位)

打开一个值中的特定位,其他位保持不变。

例如,一台PC通过向端口发送值来控制硬件。如为了打开内置扬声器,必须打开1号位,同时保持其他位不变。这种情况可以使用**按位或|**

以上一节的flags和MASK(只有1号位位1)为例。下面的语句:

    flags = flags | MASK;

把flags的1号位设置为1,其他位保持不变。

关闭位(清空位)

同样,有时需要在不影响其他位的情况下关闭指定的位。

假设要关闭flags中的1号位。同样,MASK只有1号位为1(即,打开)。可以这样做:

    flags = flags & ~MASK;

又如:(00001111)& ~(10110110)=(00001001)

MASK中为1的位在结果中都被设置为0,flags中与MASK未0相应的位在结果中都未改变。可以使用下面的简化形式:

    flags &= ~MASK

切换位

切换位指的是打开已关闭的位,或关闭已打开的位。可以使用**按位异或运算符^**

假设b是一个位(1或0),如果b位1,则1^b为0;如果b为0,在1^b为1.另外,无论b为1还是0,0^b均为b。因此,如果使用^组合一个值和一个掩码,将切换该值与MASK为1的位相对应的位,该值与MASK为0的位相对应的位不变。

要切换flags中的1号位,可以使用下面方法:

    flags = flags ^ MASK;
   
    flags ^= MASK;

又如:(00001111)^(10110110)=(10111001)

与MASK为1的位相对应的位都被切换了,与MASK为0的位相对应的位保持不变。

检查位的值

flags中的1号位是否变为1?可以这样做:

    if((flags & MASK) == MASK)
        puts("Wow!");


收藏 1 评论7 发布时间:2017-9-20 15:27

举报

7个回答
斜阳__ 回答时间:2017-9-20 15:39:58
stm32结合位带操作更爽。而且是原子操作化的读-修改-写
ctang 回答时间:2017-9-20 15:44:09
斜阳__ 发表于 2017-9-20 15:39
stm32结合位带操作更爽。而且是原子操作化的读-修改-写

是的。用其他非C语言,感觉不到位操作的强大。
五哥1 回答时间:2017-9-21 00:56:46
这个位操作的用法很精妙,要多看多用,才能用好呀
子曰好人 回答时间:2017-9-21 10:23:33
位操作很奇妙,哈哈哈,用好了事半功倍啊
wofei1314 回答时间:2017-9-22 10:59:40
这个不错,很容易看懂
pythonworld 回答时间:2017-9-23 14:49:45
mark一下,有用!
张亚飞 回答时间:2017-9-23 15:57:04
异或操作相对用的少。可以当成一个技巧来用。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版