位操作符
基本概念
位操作符使用整型的操作数。位操作符将其整型操作数视为二进制位的集合,为每一位提供检验和设置的功能。另外,这类操作符还可用于bitset 类型的操作数,该类型具有这里所描述的整型操作数的行为。
|
操作符 |
功能 |
用法 |
|
~ |
bitwise NOT(位求反) |
~expr |
|
<< |
left shift(左移) |
expr1 << expr2 |
|
>> |
right shift(右移) |
expr1 >> expr2 |
|
& |
bitwise AND(位与) |
expr1 & expr2 |
|
^ |
bitwise XOR(位异或) |
expr1 ^ expr2 |
|
| |
bitwise OR(位或) |
expr1 | expr2 |
位操作符操纵的整数的类型可以是有符号的也可以是无符号的。如果操作数
为负数,则位操作符如何处理其操作数的符号位依赖于机器。
对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用 unsigned 整型操作数。
位求反操作符
位求反操作符(~)将操作数的每一个二进制位取反:将 1 设置为 0、0 设置为 1,生成一个新值。
移位操作符
<< 和 >> 操作符提供移位操作,其右操作数标志要移动的位数。这两种操作符将其左操作数的各个位向左(<<)或向右(>>)移动若干个位(移动的位数由其右操作数指定),从而产生新的值,并丢弃移出去的位。
左移操作符(<<)在右边插入 0 以补充空位。对于右移操作符(>>),如果其操作数是无符号数,则从左边开始插入 0;如果操作数是有符号数,则插入符号位的副本或者 0 值,如何选择需依据具体的实现而定。移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的值。否则,操作的效果未定义。
位与、位或、位异或
位与操作(&)需要两个整型操作数,在每个位的位置,如果两个操作数对应的位都为 1,则操作结果中该位为 1,否则为 0。
位异或(互斥或,exclusive or)操作符(^)也需要两个整型操作数。在每个位的位置,如果两个操作数对应的位只有一个(不是两个)为 1,则操作结果中该位为 1,否则为 0。
位或(包含或,inclusive or)操作符(|)需要两个整型操作数。在每个位的位置,如果两个操作数对应的位有一个或者两个都为 1,则操作结果中该位为 1,否则为 0。
移位操作符用于 IO
输入输出标准库(IO library)分别重载了位操作符 >> 和 << 用于输入和输出。即使很多程序员从未直接使用过位操作符,但是相当多的程序都大量用到这些操作符在 IO 标准库中的重载版本。重载的操作符与该操作符的内置类型版本有相同的优先级和结合性。
IO 操作符为左结合
像其他二元操作符一样,移位操作符也是左结合的。这类操作符从左向右地结合,正好说明了为什么可以把多个输入或输出操作连接为单个语句:
cout << "hi" << " there" << endl;
执行为:
( (cout << "hi") << " there" ) << endl;
在这个语句中, 操作数"hi"与第一个 << 符号结合, 其计算结果与第二个 <<符号结合,第二个 << 符号操作后,其结果再与第三个 << 符号结合。
移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。若 IO 表达式的操作数包含了比 IO 操作符优先级低的操作符,相关的优先级别将影响书写该表达式的方式。通常需使用圆括号强制先实现右结合:
cout << 42 + 10; // ok, + has higher precedence, so the sum is printed
cout << (10 < 42); // ok: parentheses force intended grouping; prints 1
cout << 10 < 42; // error: attempt to compare cout to 42!

浙公网安备 33010602011771号