C++ Primer第四章②

# C++ Primer
## 第四章 表达式
### 位运算符
位运算符作用于**整型类型**的运算对象,并把对象看成是二进制。标准库中有一个类型bitset也可以使用二进制计算符

运算符 | 功能
---|---
~ | 求反
<< | 左移
>> | 右移
& | 位与
^ | 位亦或
\| | 位或
##### 移位运算符
```
unsigned char a = 0233; //8进制010/011/011
a << 8; //因为要左移八位,先提升为int,原先空的位数用0补齐
a << 31; //假设机器是32位,那过头的直接丢弃
a >> 3; //最右边三位被丢弃
```
左移运算符<<在右侧插入值为0的二进制位;右移运算符>>的行为依赖于左侧运算对象的类型,如果运算对象是无符号类型,左侧插入0即可,如果是带符号类型,根据具体环境而定,插入符号位的副本或者0。
###### 位求反运算符
将运算对象逐位求反:
```
a = ~a; //a = 11111111 11111111 11111111 01101000
```
###### 位与、位或、位异或运算符
```
unsigned char b1 = 0145 //八进制
unsigned char b2 = 0257 
b1 & b2 //24个高阶位都为0,00100101,都为1才为1
b1 | b2 //24个高阶位都为0,11101111,一个为1就是1
b1 ^ b2 //24个高阶位都为0,11001010,不同为1
```
*有一种常见错误是把位运算符和逻辑运算符搞混了,例如位与&逻辑与&&,自己注意。*
##### 使用位运算符
一般位运算符的使用都是比较6的,下面举个例子:
假设班级中有30个学生,老师要记录他们的测验结果,且结果只有通过和不通过两种,我们只要用一个数就可以搞定这件事:
```
unsigned long quiz = 0; //初始化,全班都没过,用long是为了至少有32位
```
比如我们要记录27号学生通过了:
```
//1UL << 27, 1UL是指unsigned long的1,然后左移27位,第0位弃用
quiz = quiz | (1UL << 27)
//假设后来检查的时候发现27号挂科了,那怎么修改呢
quiz &= ~(1UL << 27); //a &= b等价于a = a&b
//我们要查看27号有没有过
bool status = quiz & (1UL << 27);
是不是超级省内存空间啊,绝对又快又好
```
##### sizeof运算符
返回一条表达式或一个类型名称所占的字节数,如果是对指针解引用使用sizeof,就会返回指针所指对象所占的字节数,而且指针不需要有效,因为sizeof不会去管内容是什么,它只是根据类型返回内存大小罢了
###### 逗号运算符
就是我们写for循环用到的,就按照一般逗号的意思去理解好了。
原书P147有运算符优先级表,大家可以自己看,我的建议是,用到的时候去查,反正你也记不住这么多,实在不行就用括号呗。




#C++工程师#
全部评论

相关推荐

点赞 评论 收藏
分享
深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务