C++位运算符 整理不容易

目录

C++位运算符 整理不容易

这些东西,网上找到大多驴唇不对马嘴,费了相当大的劲才整理好的!

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

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

位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
移位运算
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
2 " < <" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
3 “»“右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
4 “»>“运算符,右边的位被挤掉,对于左边移出的空位一概补上0。

-————————————————————————————————————————

一. 位逻辑运算符

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

pan>

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