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

描述

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

1、位与操作( & )

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

 

C语言

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

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

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

 

2、位或操作 ( | )

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

 

C语言

从上表可以看出,位与  |  的运算原则是:只要当参与运算的两个对象中有一个是真(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、位异或操作( ^ )

位异或 ^ 的真值表:

 

C语言

从上表可以看出,位异或 ^ 的运算原则是:当参与运算的两个对象中有一个是真(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,超出数值范围的部分则丢弃。如下:

 

C语言

 

6、位操作的实际运用

6.1、将特定位清零

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

 

C语言

 

6.2、将特定位置 1

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

 

C语言

 

6.3、特定位取反

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

 

C语言

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

 

6.4、获取特定二进制位

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

 

C语言
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分