位运算—与(&),或(|),取反(~),异或(^)详解

位运算—与(&),或(|),取反(~),异或(^)详解

按位与(&)

按位与运算符&,和逻辑与(&&)运算符类似,只有一个&,都是同为1则为1,有0就为0,按位相互运算。

实例:11&5

11 0000 0000  0000 0000  0000 0000  0000 1011
 5 0000 0000  0000 0000  0000 0000  0000 0101
& ------------------------------------------
   0000 0000  0000 0000  0000 0000  0000 0001

可以看到,转换成2进制,长度需要相同,不足的话高位补0。

代码如下:

#include<stdio.h>
int main()
{
    int a;
    a=11&5;
    printf("a=%d\n",a);
    return 0;
}

运行结果:

a = 1

按位与运算符的作用:

1.清零

我们可以对某一个数与0进行按位与运算,由于两个位都为1才为1,最终全部位都变为0,起到清零的作用。

2.取指定位

如某些存储场景下,“第14位表示xxxx”,我们需要取出14位,则可以让原数值与数字15,即低4位全1(XXXX 1111),进行按位与运算,得到的结果即是原数值的1~4位的值。

3.判断奇数偶数

一个数的奇偶性可以通过二进制位的最低一位是0还是1判别,所以可以将这个数与1进行&运算,判断是0是1可知奇偶。

按位或(|)

**按位与运算符|,和逻辑与(||)运算符类似,只有一个|,都是有1则为1,全0才是0,按位相互运算。

实例:11&9

11 0000 0000  0000 0000  0000 0000  0000 1011
 9 0000 0000  0000 0000  0000 0000  0000 1001
 | ------------------------------------------
11 0000 0000  0000 0000  0000 0000  0000 1011

代码:

#include<stdio.h>
int main()
{
    int a;
    a=11|9;
    printf("a=%d\n",a);
    return 0;
}

运行结果:

a = 11

按位或运算符的作用:

对一个数字的指定位置为1,如“某个数字的第七位”表示开关,原先是0,需要改为1的状态,即可以将这个数字与64按位或,即可得到第七位变为1,其余位的值依旧不变。

按位异或(^)

^表示按位异或运算符,顾名思义,相异,相同为0,不同为1。

实例:11&9

11 0000 0000  0000 0000  0000 0000  0000 1011
9  0000 0000  0000 0000  0000 0000  0000 1001
^  ------------------------------------------
2  0000 0000  0000 0000  0000 0000  0000 0010

代码:

#include<stdio.h>
int main()
{
    int a;
    a=11^9;
    printf("a=%d\n",a);
    return 0;
}

运行结果:

a = 2

按位异或运算符的作用:

1. 指定位数的翻转:

如想对某个数字的低4位进行翻转,则可以将这个数字与15(二进制为00001111)进行按位异或运算,既可以将原数字的低四位进行翻转,即高四位不变,低四位0变1,1变0。

2. 与0异或还是原值:

大家可以自行实验,一个数字与0进行异或,结果还是原值。

3. 交换两个数字:

除了之前我们学习交换两个数字需要第三个变量做中介之外,如今可以通过异或运算进行,代码如下:

#include<stdio.h>
int swap(int *a,int *b)
{
    if (*a!=*b)
    {
        *a=*a^*b;
        *b=*b^*a;
        *a=*a^*b;
    }
    return 0;
}
int main()
{
    int a=11;
    int b=9;
    swap(&a,&b);
    printf("a=%d b=%d\n",a,b);
    return 0;
}

运行结果

a = 9 b = 11

按位取反(~)

~取反运算符,是对数值的二进制位进行取反,是第一个单目运算符,因为只有一个运算对象,运算过程是即0变为1,1变为0,非常好理解。

实例:11&9

~1 = 0
~0 = 1

代码:

#include<stdio.h>
int main()
{
    unsigned int a=1;
    printf("~a=%u\n",~a);
    return 0;
}

运行结果:

~a = 4294967294

按位取反运算符的作用:

作用就是取反(doge)。

posted @   rose_halo  阅读(816)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示