江小南

V1

2023/01/15阅读:12主题:萌绿

【C语言】位运算符

阅读本文,需要对C语言的基础知识有所了解。C语言基础,我给大家准备了详细的学习资料,微信公众号主页回复“C语言”即可领取。

1. 位运算符的分类

运算符 说明
<< 左移
>> 右移
~ 按位取反
| 按位或
^ 按位异或
& 按位与

说明:要和逻辑运算符!(取反)、&&(逻辑与)、||(逻辑或)区分开来。

位运算符只能用于对整型数据操作

2. 运算规则

左移高位丢弃,低位补0,相当于乘以2。工作中很多时候申请内存时会用。例如要申请1GB大小的空间,可以使用malloc(1<<30)。

右移低位丢弃,正数的高位补0(无符号数我们认为是正数),负数的高位补1。右移相当于除以2。移位比乘法和除法的效率要高,负数右移,对偶数来说是除以2,但对奇数来说是先减1再除以2。例如:-8>>1,得到的是-4,但-7>>1得到的并不是-3而是-4。另外,对于-1来说,无论右移多少位,值永远为-1。

异或:相同的数进行异或时,结果为0。任何数和0异或的结果是其本身。

按位取反:数位上的数是1变为0,0变为1。

按位与:两个位都为1,结果为1。

按位或: 有一个位为1,结果为1。

3. 示例

示例1:

#include <stdio.h>

int main() {
    int i=5;
    short j;
    j=i<<1// 一个变量移动以后自身不会变化
    printf("j=%d\n",j); // 左移是乘以2
    j=i>>1// 一个变量移动以后自身不会变化
    printf("j=%d\n",j); // 左移是除以2
    return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
j=10
j=2
进程已结束,退出代码为 0

解析:左移相当于乘以2,右移相当于除以2。

示例2:

#include <stdio.h>

int main() {
    short i;
    short j;
    i=0x8011;
    unsigned short s=0x8011;  // unsigned表示无符号数,无符号数只能是0或正数
    unsigned short r=0;
    j=i>>1// 对i右移,有符号数右移
    r=s>>1// 对s右移,无符号数右移
    printf("j=%d,r=%u\n",j,r);
    printf("i=%u,s=%u\n",i,s);
    return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
j=-16376,r=16392
i=4294934545,s=32785

进程已结束,退出代码为 0

解析:数字之前加0x表示16进制,数字之后加H表示十六进制数。

负数用补码表示,要得到原码,需要进行取反并加1

示例3:

#include <stdio.h>

int main() {
    short i;
    short j;
    i=5,j=7;
    printf("i & j=%d\n",i&j);
    printf("i | j=%d\n",i|j);
    printf("i ^ j=%d\n",i^j);
    printf("~i=%d\n",~i);
    return 0;
}
"F:\Computer\Project\practice\19\19.3-Bitwise operation\cmake-build-debug\19_3_Bitwise_operation.exe"
i & j=5
i | j=7
i ^ j=2
~i=-6

进程已结束,退出代码为 0

解析:按照运算规则即可得到答案。

4. 异或运算符特性

异或运算符有两个特性:

  1. 任何数和0异或得到自身。
  2. 两个相等的数异或得到0。

思考?如何在一堆数中找出出现1次的那个数?

#include <stdio.h>

int main() {
    int i;
    int arr[5]={8,5,3,5,8};
    int result=0;
    for(i=0;i<5;i++){
        result ^=arr[i];
    }
    printf("%d\n",result); // 输出为3
    return 0;
}
F:\Computer\Project\practice\19\19.3-characteristic\cmake-build-debug\19_3_characteristic.exe
3

进程已结束,退出代码为 0

解析:利用特性计算。

分类:

后端

标签:

C++

作者介绍

江小南
V1