一些有趣且有用高效的位运算方法

    大家都知道位运算的具体功能,但是很多人在具体实际编程对何时使用位运算还是不够熟悉。位运算是快速高效的,下面我们详细陈列下一些有趣且有用高效的位运算方法。

一、清0操作

    与(&)操作可以实现数值的快速清0操作:我们只需要将对应数值与0进行相与(&)即可。

    代码如下(获取二进制的代码我们可以看前文:如何快速的打印一个整数的底层存储二进制_如何用函数知道一个数在计算机中存储的二进制是什么-CSDN博客

 

int main() {
    t_m_bitstr(100);
    t_m_bitstr(0);
    t_m_bitstr(100&0);
    
}

 

二、获取指定位操作

    或(|)操作可以让我们获取指定位数的值:我们只需要将指定位数移位与1或11或111((1<<n)-1)即可。例如我们要获取数值100的6和7位(获取2位)二进制数组,那么我们需要将100右移动5位,然后与(1<<2)-1) = 3先或即可。

    第一步,我们要获取100数值的6-7位,我们先将100右移动5位得到如下:

    第二步,我们需要获取2个bit位,那么我们需要得到相或(|)的值为(1<<2)-1 = 4-1 = 3:

    第三步,我们用上两步的数值进行相或,得到所要的结果:

     代码如下:

int main() {
    t_m_bitstr(100);
    t_m_bitstr(100>>5);
    t_m_bitstr(1);
    t_m_bitstr((1<<2)-1);
    t_m_bitstr((100>>5)|((1<<2)-1));

}

三、值交换

    我们可以在不使用中间变量的情况下,通过高效的异或操作,实现两数值的交换。

a = a^b

b = b^a

a = a^b

    我们用数值100和77来描述,其实数值77相当于进行如下操作:

     数值100也是类似,我们就不再描述了,代码如下:

int main() {
    int a = 100;
    int b = 77;
    t_m_bitstr(a);
    t_m_bitstr(b);
    a = a^b;
    b = b^a;
    a = a^b;
    t_m_bitstr(a);
    t_m_bitstr(b);
    
}

四、判断是否为0

    通过一个数值与0相或(|),判断是否为0。

int isZero(int a){
    return !(a|0);
}

int main() {
    if(isZero(0)){
        printf("is zero\n");
    }

}

五、两数是否相等

    通过两个数相异或(^),判断是否相等。

int isEqual(int x, int y){
    return !(x^y);
}

int main() {
    if(isEqual(100, 100)){
        printf("is equal\n");
    }

}

 

六、判断是否为正数

    对于输入的一个正数,如果是正数,则返回1。(此例子需要通过移位运算,我本地计算机一个整数占有4字节,也就是32位,故下面移位31位)。

int isPositive(int x){
    return !((x>>31)+!x);
}

int main() {
    
    if(isPositive(100)){
        printf("is positive\n");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TPCloud

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值