位运算专题

  1. 位运算专题
  2. 符号
    1. &(按位与)
    2. |(按位或)
    3. ^(按位异或)
    4. ~(按位取反)
    5. <<(左移)
    6. >>(右移)

位运算专题

学一下c语言中的位运算,考试要考,应试用。

符号

&(按位与)

参加运算的两个数据,如果相应的二进制位都为1,则该位结果为1,否则为0.

如下:0&0=0,0&1=0,1&0=0,1&1=1

image-20230922100827368

|(按位或)

参加运算的两个数据,如果相应的二进制位都为0,则该位结果为0.否则为1.

如下0|0=0, 0|1=1, 1|0=1, 1|1=1

image-20230922101039106

^(按位异或)

按位异或也成为XOR运算符,如果相应的二进制位不同,则该位结果为1,否则为0.

如下0^0=0, 0^1=1, 1^0=1, 1^1=0

image-20230922101947616

不用中间变量交换变量的方法如下

#include<string.h>
#include <stdio.h>

int main() {
    int a = 3, b = 10;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("%d,%d", a, b);
    return 0;
}

image-20230922102340251

~(按位取反)

此运算符为一个单目运算符,用来对一个二进制数按位取反,例:~11的计算过程如下

image-20230923125419810

<<(左移)

用来讲一个数的各位二进制全部左移若干位。

例子:11<<3计算过程如下

image-20230923125608117

左移一位相当于乘以2,但只适用于该数左移时被溢出舍弃的高位中不包含1的情况,而且移动后的表达式的值,要与被移动的表达式的符号是一致的。

>>(右移)

a>>2表示将a对各二进制右移2位,移到右端的低位被舍弃,对无符号数,高位补0,原来的符号位补1,左边可能补0也可能补1,具体补什么依赖于机器。

image-20230923125959962

值得注意的是,让一个数值或变量左移大于自身长度的位数 或者 使用左移右移移动的位数为负值,在不同的编译器中可能结果不一致,我们应该尽量避免这种情况。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。