微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C&C++ 位运算基础

本篇博客是对educoder相关实训知识的总结


一、位运算

位运算允许在二进制位级别上对数据进行操作。C 和 C++ 支持 6 种不同的位运算符。

运算符

名称

示例

说明

&

按位与

a & b

a 和 b 的每一位作与运算

|

按位或

a | b

a 和 b 的每一位作或运算

^

按位异或

a ^ b

a 和 b 的每一位作异或运算

~

按位取反

~ a

将 a 的每一位取反

<<

向左移位

a << b

将 a 的每一位向左移 b 位

>>

向右移位

a >> b

将 a 的每一位向右移 b 位

二、位运算符

1、按位与

两个操作数的按位与(&)是将两个操作数二进制表示的对应位进行与运算,即如果两个操作数的对应位都为1,则结果的对应位也为1,否则为0

例如,3 & 14 结果为2,计算方法为:

3 的二进制表示: 00000011 ;

14 的二进制表示: 00001110 ;

3 & 14 的二进制表示: 00000010 。

2、按位或

两个操作数的按位或()是将两个操作数二进制表示的对应位进行或运算,即如果两个操作数的对应位都为0,则结果的对应位也为0,否则为1

例如,3 | 14 结果为15,计算方法是:

     3 的二进制表示: 00000011 ;
    14 的二进制表示: 00001110 ;
3 | 14 的二进制表示: 00001111 。

3、按位异或

两个操作数的按位异或(^)是将两个操作数二进制表示的对应位进行异或运算,即如果两个操作数的对应位不相同,则结果的对应位为1,相同则为0

例如,3 ^ 14 结果为13,计算方法是:

     3 的二进制表示: 00000011 ;
    14 的二进制表示: 00001110 ;
3 ^ 14 的二进制表示: 00001101 。

4、按位取反

按位取反(~)是将操作数二进制表示的对应位进行取反运算,即如果操作数的对应位为0,则结果的对应位为1,操作数为0,则结果对应位为0

例如,~14 结果为241,计算方法是:

  14 的二进制表示: 00001110 ;
~ 14 的二进制表示: 11110001 。

5、向左移位

向左移位(<<)是将左操作数的二进制表示向左移位,移动的位数就是右操作数(右操作数必须是非负值)的值,右端移出的空位填充0,移位后的左操作数的值即为运算的结果。

例如,3 << 2 结果为12,计算方法是:

     3 的二进制表示: 00000011 ;
3 << 2 的二进制表示: 00001100 ;

6、向右移位

向右移位(>>)是将左操作数的二进制表示向右移位,移动的位数就是右操作数的值,移位后的左操作数的值即为运算的结果。

左端移出的空位填充方式取决于左操作数的类型和具体的值:如果左操作数是无符号类型,或者是有符号类型但其值非负(最高位为0),那么高位填充0;如果左操作数是有符号类型,并且为负数(最高位为1),高位填充的值取决于所用的计算机系统,有的 C 和 C++ 系统实现填充0,有的填充1

三、字符的二进制位的计算

有了上述位运算,我们就可以使用按位与运算判断一个字符的二进制表示(共8位)的某一位是1还是0

例如下面的语句输出了字符变量 c 的二进制表示的第7位的值(c 的二进制表示有8位,从左到右分别为第 1 ~ 8 位):

cout << (int)(bool)(c & 0x02);

该语句输出表达式(int)(bool)(c & 0x02)的值。该表达式有三个运算符:强制类型转换( int )、强制类型转换( bool )和按位与运算符 &。

因为括号的原因,表达式先计算c & 0x02。0x02 是十六进制的02,其二进制表示为 00000010 。将 c 和 0x02 进行按位与,除了第7位外,不需要管 c 的其它位是什么,因为 0x02 除了第7位,其它位都是0。那么就有,如果 c 的第7位如果是1,则按位与的结果就是 00000010,否则结果为 00000000。

然后再进行两个类型转换运算,优先级相同,右结合,所以先计算(bool)(c & 0x02),即将计算结果转换为 bool 类型。如果c & 0x02的值为 00000000,则结果为 false,否则结果为 true(即只要有一位不为0,则整个十六进制数转换后即为 true)。最后再把计算结果转换为 int 类型,即如果前面的计算结果是 true,转换结果就是1,否则是0

所以整个表达式的运算效果是:如果 c 的第7位为0,就输出0,第7位数为1输出1。以此类推,我们就可以计算出 c 对应的二进制8位 0-1 串了。

更多关于位运算符的使用参见:百度百科位运算

知识来源: educoder-c&c++程序设计 

原文地址:https://www.jb51.cc/wenti/3282147.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐