之前介绍运算符时提到了位运算符,但是对于位运算符的功能,大家可能没有比较直观的认识,所以这篇文章就和大家详细介绍一下位运算符的功能及代码实现。
目录
1.1“按位与”可以将指定的存储单元中的数清零,也可以将指定的二进制位变为0。
1.3“按位与”可以将一个整数中特定的位置保留下来,并使得其他位变为0。
1.按位与运算符(&)
1.1“按位与”可以将指定的存储单元中的数清零,也可以将指定的二进制位变为0。
需要清零时,可以按照以下方法选择一个整数:将待清零整数中为1的位,选择的整数的相应的位为0(满足该条件的数可能有很多,随意选择一个即可)。然后将待清零整数与新选择的整数进行“&”运算,得到的整数指定的位即为0。
#include<stdio.h>
int main()
{
int a=4;//现在欲使a变成0 ,已知a的二进制数为00000000000000000000000000000100 ,则选择的数从右至左第三位应该为0
int b=1;//按照上面的分析1,2,3等均满足从右至左第三位应该为0,那么直接将其与a进行按位与运算即可
a=a&b;
printf("%d",a);
return 0;
}
上面的代码,大家可以自己敲一敲试试,加深理解。当然,更建议大家多尝试几个不同的a值,从而对于按位与运算符的使用更熟练和清晰。
1.2“按位与”可以截取一个整数中的某些特定位置。
#include<stdio.h>
int main()
{
int num;
scanf("%d",&num);//我们这里输入1754,其二进制为000011011011010
printf("%d",num&255);//255的二进制为,11111111,那么根据按位与运算符的功能,1754的高八位直接清零,我们就得到其低八位
return 0;
}
我们想得到某些特定的位置,只需要找到我们要的位置均为1的数,并将它和要求的数进行按位与运算即可。
1.3“按位与”可以将一个整数中特定的位置保留下来,并使得其他位变为0。
方法是选取一个整数,该整数中相应的特定位为1,其他位为0。将选择的数与原来的整数进行按位与的运算,运算结果即可保留原整数位的特定位。
#include<stdio.h>
int main()
{
int num;
scanf("%d",&num);//我们这里输入1754,其二进制为000011011011010
printf("%d",num&255);//255的二进制为,11111111,那么根据按位与运算符的功能,1754的高八位直接清零,我们就得到其低八位
num=num&255;
return 0;
}
其实所谓的第三功能就是在第二功能的基础上,将最后得到的值赋给原整数。
2.按位与运算符(|)
按位与运算符常用来将一个整数的某些特定位,置换为1。
#include<stdio.h>
int main()
{
int a=1;
a=a|255;
printf("%d",a);
return 0;
}
如上面的代码所展示,由于按位与运算符的特点,我们只需要让选择的数的特定位为1,那么无论原数该位是否为1,最终都会变成1。
3.按位异或运算符(^)
3.1使特定位翻转。
选择一个整数,其特定位为1,其他位为0,然后将待翻转位的整数与选择的整数进行“^”运算。
#include<stdio.h>
int main()
{
int a=10;//10的二进制数为 1010 ,我们这里就翻转最高位的1,那么就找该位置为1的,其他位为0数即可
int b=8; //24的二进制数为 1000,所以结果应该为2
printf("%d",a^b);
return 0;
}
3.2与0相^,保留原值。
#include<stdio.h>
int main()
{
int a=12;
printf("%d",a^0);
return 0;
}
按位异或的特点就是只有相异才会等于1,而0各个位置均为0,0与任何数进行按位异或运算时,该数为0的位置因为相同仍为0,为1的位置因为相异仍为1
3.3不使用临时中介变量,而直接交换两个值。
#include<stdio.h>
int main()
{
int a=2,b=3;
a=a^b;
b=b^a;
a=a^b;
printf("%d %d",a,b);
return 0;
}
在上面的代码中,由前两个赋值语句“num=num^(num1^num2)”,“num2^(num1^num2)”等价于“num1^(num2^num2)”。由于任何一个数与本身相异或,结果均为0。因此num2得到了num1的值,num1通过第三个赋值语句也得到num2的值。
4.按位取反运算符(~)
功能是对运算数的二进制位按位“求反”。即,将0变成1,将1变成0。这个就没什么好介绍的,大家根据需求使用即可。
例如,(~)(00010101)的结果为11101010
~运算符的优先级高于算术运算符、关系运算符、逻辑运算符以及其他位运算符。
5.左移运算符(<<)
左移运算符(<<)是二元运算符,结合方向为自左向右,其功能是把“<<”左边的运算数的各二进制位依次左移,移动的位数由“<<”右边的运算数指定。
左移时,高位溢出被舍弃,低位需要补若干个0。
可用于是一个整数左移一位,相当于乘以2,左移n位相当于乘以2^n。左移运算速度比乘法运算速度要快得多。
6.右移运算符(>>)
右移运算符(>>)是二元运算符,结合方向为自左至右,其功能是把“>>”左边的运算数的各二进制位依次右移,移动的位数由“>>”右边的运算数指定。
右移位运算时,低位移出被舍弃。对于高位的处理,需要分情况处理:若是无符号数,右移时高位补0;而对于有符号数,并且原来的符号位为1,即原数为负数时,则左边移入的是0还是1取决于所用的编译系统。若移入的是0,称为“逻辑右移”,即简单的右移;若移入的为1,称为“算术右移”。
可用于是一个整数右移一位,相当于除以2,左移n位相当于除以2^n。右移运算速度比除法运算速度要快得多。