位运算
C++位运算符(满足左结合律)
- 位运算符作用于整数对象,并将位运算对象看作二进制集合
- 一般来说,若运算对象位“小整型”,则其值会被自动提升
- 运算对象可以为有符号型或无符号型
(有符号型;具体如何处理取决于机器,并且左移可能会改变符号位,因此属于未定义行为,不推荐使用)
- 优先级
算术运算符 > 移位运算符 > 关系运算符 赋值运算符 条件运算符
- 移位运算符
左移<<
shift-expression << additive-expression
左移运算符将导致 shift-expression
中的位向左移动 additive-expression
所指定的位数。 因移位运算而空出的位上将用零填充。 左移是逻辑移动(从末端移掉的位将被舍弃,包括符号位)。
右移>>
shift-expression >> additive-expression
右移运算符将导致 shift-expression
中的位模式向右移动 additive-expression
所指定的位数。 对于无符号数字,因移位运算而空出的位上将用零填充。 对于有符号数字,符号位用于填充空出的位。 也就是说,如果数字为正,则使用 0;如果数字为负,则使用 1。
附;
1 以下是 C++ ISO 规范 说明
E1 << E2
的值是 E1
向左移动 E2
位的结果,空出的位用零填充。 如果 E1
属于无符号类型,则结果的值为 E1 × 2
E2,约减的模一大于结果类型可表示的最大值。 否则,如果 E1
属于有符号类型且为非负值,E1 × 2
E2 可由结果类型的相应无符号类型表示,则该值转换为结果类型后即为得到的值;否则,该行为是不确定的。
E1 >> E2
的值是 E1
向右移动 E2
位的结果。 如果 E1
属于无符号类型或 E1
属于有符号类型且为非负值,则结果值为 E1/2
E2 之商的整数部分。 如果 E1
属于有符号类型且为负值,则结果值由实现决定。
- 位与,或,非运算符
在两个运算对象上逐位执行相应的操作
与&
B1&B2
或|
B1|B2
非^
B1^B2
- 位求反运算符~
~bits 1变为0,0变为1
(char类型提升为int类型,提升后原位保持不变,往高位增加0)
参考;MSDN在线文档
C++primer