位运算符作用于整数类型的运算对象,并把运算对象看成是二进制的集合。
位运算符提供检查和设置二进制位的功能
bitsit后讲
位运算符(左结合律)
运算符 | 功能 | 用法 |
~ | 位求反 | ~expr |
<< | 左移 | Expr1 <<Expr2 |
>> | 右移 | Expr1 >> Expr2 |
& | 位与 | Expr & expr |
^ | 位异或 | expr^ expr |
| | 位或 | expr | expr |
Warning: 关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型
移位运算
右侧运算对象一定不能为负,而且值必须严格小于结果的位数,否则会产生未定义的行为。
移出边界的位就被舍弃掉了
//假定char占8位,int占32位
//0233是八进制的字面值
unsigned char bits = 0233;
10011011
bits<<8 // bits 提升成int类型,然后向左移动8位
00000000 | 00000000 | 10011011 | 00000000 |
bits << 31 //向左移动31位,左边超出的位被丢弃
10000000 | 00000000 | 00000000 | 00000000 |
bits >> 3//向右移动3位,最右边3位丢弃掉了
00000000 | 00000000 | 00000000 | 00010011 |
左移运算符(<<)在右侧插入值为0的二进制位。
右移运算符 (>>)对于无符号类型,在左侧插入值为0的二进制位;如果该运算对象是带符号类型,在左侧插入符号位的副本或值位0的二进制位,环境决定
位求反运算符
位求反运算符(~)将运算对象逐位求反后生成一个新值,将0换为1,将1换成0
usigned char bits = 0227; 10010111
~bits
11111111 | 11111111 | 11111111 | 01101000 |
char类型运算对象首先提升为int
然后往高位(high order position)加0
然后再反
位与,位或,位异或运算符
unsigned char b1 = 0145; 01100101
unsigned char b2 = 2057; 10101111
b1 & b2 24个高位都是0 | 00100101 |
b1 | b2 24个高位都是0 | 11101111 |
b1 ^ b2 24个高位都是0 | 11001010 |
(&)两个都是1结果是1,否则为0
(|)有一个1就是1,否则为0
(^)有且只有一个1为1,否则为0
使用位运算符
用一个二进制位代表一个学生是否通过
unsigned long quiz = 0; //我们把这个值当作是位的集合来用
quiz1有32位
例如:需要对序号27的学生对应的位进行设置
首先创建一个值,该值只有第27位是1其他位都是0
再将这个值与quiz1进行位与运算
运用一个unsigned long类型的整数字面值1再用左移运算符
1UL << 27//生成一个值只有第27位为1
Quiz1 |= 1UL<< 27;//表示学生27通过了测验
Quiz1 &= ~(1UL << 27);//学生27没有通过测验
bool status = quiz1 & (1UL << 27);//学生27是否通过测试
如果quiz1第27位是1则返回非0 , 否则为0
|=的运算相当于
quiz1 = quiz1 | 1UL << 27;
移位运算(又叫IO运算符)满足左结合律