C++ 位运算

C++源自C,在提供高级语言便利的同时,也继承了C在硬件编程方面的功能。因此适用于编写设备驱动和嵌入式大代码。

 

C++/C 提供位逻辑运算符和移位运算符。二者只能用于整形和字符型。位运算符是对每位进行操作而不影响左右两位,这有别于常规运算符(&& || !)是将整个数进行操作的。

 

 

一.    位逻辑运算符

--------------------------------------------------------------------------------------------

1.    ~ 按位取反

 

将1变为0,将0变为1

 

EG:

 

~(10011010)

 

(01100101)

 

 

注:

 

VC++编译器,计算~10,得出的结果是-11。为什么不是5呢 

 

10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11? 

 

 

VC是32位编译器,所以 

 

10 = 00000000 00000000 00000000   00001010 

 

~10 = 11111111 11111111   11111111   11110101 =   -11

 

可以通过掩码(位与) 与15位与

 

   15 = 00000000 00000000 00000000   00001111

 

~10 = 00000000 00000000 00000000   00000101   =   -11

 

 

2.    & 按位取与

-----------------------------------------------------------------------------------------------

只有两个操作数都是1结果才是1,否则为0

 

10 = 00000000 00000000 00000000   00001010 

 

12 = 00000000 00000000 00000000   00001100

 

&

 

8 = 00000000 00000000 00000000   00001000

 

 

3.    | 按位取或

---------------------------------------------------------------------------------------

两个操作数任意一位为1结果就是1

 

10 = 00000000 00000000 00000000   00001010 

 

12 = 00000000 00000000 00000000   00001100

 

|

 

14 = 00000000 00000000 00000000   00001110

 

 

 

4.    ^ 按位异或

-----------------------------------------------------------------------------------------

两个操作数不同为1,相同为0

 

10 = 00000000 00000000 00000000   00001010 

 

12 = 00000000 00000000 00000000   00001100

 

^

 

14 = 00000000 00000000 00000000   00000110

 

 

 

5.    用法:掩码

------------------------------------------------------------------------------------------------------------------------

掩码是通过&(位与)将某些位设置为开(1),将某些位设置为关(0)。将掩码0看做不透明,将1看着透明。

 

EG:

 

如只显示第二、三位

 

107 = 0110 1011

 

6            = 0000 0110

 

&

 

2   = 0000 0010

 

 

 

6.    用法:打开位

----------------------------------------------------------------------------------------------------------------------

打开位是通过 |(位或)打开一个值的特定位,同时保持其他位的不变。这是因为和0位或都为0,和1位或都为1。

 

EG:

 

如只打开第二、三位

 

107 = 0110 1011

 

6   = 0000 0110

 

|

 

111 = 0110 1111

 

 

7.    用法:关闭位

--------------------------------------------------------------------------

关闭某些位

 

EG:

 

如关闭第二、三位

 

107 = 0110 1011

 

6    = 0000 0110

 

& ~

 

105 = 0110 1001

 

 

8.    用法:转置位

-------------------------------------------------------------------------------------------

如果一位为1则转置为0,如果一位为1则转置为0

 

 

EG:

 

如转置第二、三位

 

107 = 0110 1011

 

6    = 0000 0110

 

^

 

105 = 0110 1101

 

 

 

二.    移位运算符

---------------------------------------------------------------------------------------------------------------

<< 左移 

左移运算符是把操作数的值的每一位向左移动,移动的位数有右边的操作数决定,右侧空出的位数用0填充

 

EG:

 

如转置第二、三位

 

107 = 0110 1011 <<2

 

<< 

 

172 = 1010 1100

 

 

 

       在计算机中由于是32位的

 

107 = 0000 0000   0000 0000   0000 0000   0110 1011 <<2

 

<< 

 

428 = 0000 0000   0000 0000   0000 0001   1010 1100

 

 

>> 右移 

---------------------------------------------------------------------------------------------------------------------

右移运算符是把操作数的值的每一位向右移动,移动的位数有右边的操作数决定,左边丢弃的位数用0填充

 

EG:

 

如转置第二、三位

 

107 = 0110 1011 >>2

 

>> 

 

26 = 0001 1010

 

你可能感兴趣的:(C++ 位运算)