C++位运算详解

位运算

C++位运算符(满足左结合律)

 

  1.  位运算符作用于整数对象,并将位运算对象看作二进制集合

 

  1.  一般来说,若运算对象位“小整型”,则其值会被自动提升

 

  1.  运算对象可以为有符号型或无符号型

(有符号型;具体如何处理取决于机器,并且左移可能会改变符号位,因此属于未定义行为,不推荐使用)

 

  1. 优先级

算术运算符 > 移位运算符 > 关系运算符  赋值运算符  条件运算符

 

 

 

  1. 移位运算符

 

左移<<

    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 × 2E2,约减的模一大于结果类型可表示的最大值。 否则,如果 E1 属于有符号类型且为非负值,E1 × 2E2 可由结果类型的相应无符号类型表示,则该值转换为结果类型后即为得到的值;否则,该行为是不确定的。

E1 >> E2 的值是 E1 向右移动 E2 位的结果。 如果 E1 属于无符号类型或 E1 属于有符号类型且为非负值,则结果值为 E1/2E2 之商的整数部分。 如果 E1 属于有符号类型且为负值,则结果值由实现决定。

 

 

 

  1. 位与,或,非运算符

 在两个运算对象上逐位执行相应的操作

与&

        B1&B2

或|

        B1|B2 

非^ 

        B1^B2

 

 

  1. 位求反运算符~

 

~bits   1变为0,0变为1

 

(char类型提升为int类型,提升后原位保持不变,往高位增加0)

 

 

 

参考;MSDN在线文档

      C++primer 

猜你喜欢

转载自blog.csdn.net/qq_41308027/article/details/82958442