【C语言】按位运算符

按位运算符讲解

我们都知道,数值和字符在内存里都是以 0 和 1 组成序列的形式存在的,,打个比方:

10 = 00001010
//这里以一个字节为例子,具体多少位由使用的编程语言决定

我们可以对每个位置上的数做出操作,这也是按位运算符的运算逻辑。

按位运算符总共有6个:

  1. & 按位与
  2. | 按位或
  3. ^ 按位异或
  4. << 左移
  5. >> 右移
  6. ~ 按位取反

我们来一个个看


& 按位与


& 是个双目运算符,双目是指参与运算的对应二进制位,它的逻辑也比较容易理解:对应二进制位均为1时值才为1,否则为0,但是要注意的是,参与运算的数都以补码的形式存在,大概介绍一下补码:正数的补码就是其本身,负数的补码在原码的基础上符号位不变,其余位取反。

举个容易理解的例子,3&4

3 : 00000011//3的2进制补码
4 : 00000100//4的2进制补码
    00000000// 3&4结果为0的2进制补码

不难看出,任意数 &0都为0。我们可以用 **&**来使特定位为 0


| 按位或


| 也是个双目操作符,它的逻辑很简单:运算中对应的位中有 1 那么结果就是 1

100000001
300000011
     00000011//结果为3

^ 按位异或


^ 是个双目操作符,逻辑也比较清晰:对应的位相同结果为 0,不同结果就为 1

100000001
300000011
     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
400000100
4>>1 : 00000010//为2

不难看出,<<1 (左移1) 有乘 2的效果,>>1 (右移1) 有除2 的效果

另外,小数 >>0 可以取整


~ 按位取反


符如其名,~ 的逻辑是:对应的位 1 变 0,0 变 1

你可能感兴趣的:(c语言)