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 |