大家都知道位运算的具体功能,但是很多人在具体实际编程对何时使用位运算还是不够熟悉。位运算是快速高效的,下面我们详细陈列下一些有趣且有用高效的位运算方法。
一、清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");
}
}