按位运算符讲解
我们都知道,数值和字符在内存里都是以 0 和 1 组成序列的形式存在的,,打个比方:
10 = 00001010
//这里以一个字节为例子,具体多少位由使用的编程语言决定
我们可以对每个位置上的数做出操作,这也是按位运算符的运算逻辑。
按位运算符总共有6个:
- & 按位与
- | 按位或
- ^ 按位异或
- << 左移
- >> 右移
- ~ 按位取反
我们来一个个看
& 按位与
& 是个双目运算符,双目是指参与运算的对应二进制位,它的逻辑也比较容易理解:对应二进制位均为1时值才为1,否则为0,但是要注意的是,参与运算的数都以补码的形式存在,大概介绍一下补码:正数的补码就是其本身,负数的补码在原码的基础上符号位不变,其余位取反。
举个容易理解的例子,3&4
3 : 00000011//3的2进制补码
4 : 00000100//4的2进制补码
00000000// 3&4结果为0的2进制补码
不难看出,任意数 &0都为0。我们可以用 **&**来使特定位为 0
| 按位或
| 也是个双目操作符,它的逻辑很简单:运算中对应的位中有 1 那么结果就是 1
1 : 00000001
3 : 00000011
00000011//结果为3
^ 按位异或
^ 是个双目操作符,逻辑也比较清晰:对应的位相同结果为 0,不同结果就为 1
1 : 00000001
3 : 00000011
00000010//结果为2
我们看一小段代码:
int main()
{
int n = 1;
int m = 2;
n ^= m;
m ^= n;
n ^= m;
printf("%d,%d",n,m);
return 0;
}
我们惊奇地发现 n 与 m的值完成了互换,这是为什么呢?
一个数与自身进行按位异或运算,其结果必为0,一个任意数与0进行异或运算,结果为其本身。
可以自己多写几组运算品一品。
<< 左移 、>>右移
移位运算符将位按某个特定值左移或者右移,超过的位丢失,空出的位补 0
1 : 00000001
1<<1 : 00000010//为2
4 :00000100
4>>1 : 00000010//为2
不难看出,<<1 (左移1) 有乘 2的效果,>>1 (右移1) 有除2 的效果
另外,小数 >>0 可以取整
~ 按位取反
符如其名,~ 的逻辑是:对应的位 1 变 0,0 变 1