位运算是指按二进制进行的运算。在系统软件中尝尝需要处理二进制位的问题,C语言提供了6个位操作运算符,这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
1、按位与(&):指参加运算的两个数据按二进制位进行“与”运算。若两个相应的二进制位都为1,则该位的结果值为1,否则为0.这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false.按位与其实与逻辑上的“与”运算规则一致。电脑内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用来描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2)补足为一个字节则是 00001011(2)。5的二进制编码补足成一个字节则是 00000101(2),对其二者进行与运算:
00001011(2)
& 00000101(2)
00000001(2)
由此可知,11&5=1;C语言代码如下:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=8;
int b=5;
printf("%d",a&b);
}
2、按位或(|):两个相应的二进制位中只要有一个为1,该位的结果值为1.借用逻辑数学中或运算的话来说就是,一真为真。
例如:60(8)|17(8),将八进制的60与17进行按位或运算。
00110000
| 00001111
00111111
C语言代码如下:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=060;
int b=017;
printf("%d",a|b);
}
3、异或(^):其规则是,若参加运算的两个二进制位值不同则结果值为1,否则为0;
例:00111001
^00101010
00010011
C语言代码:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=071;
int b=052;
printf("%d",a^b);
}
4、取反(~):这是个一元运算符,用于求整数的二进制反码,这里比较简单就不多说了。
例如:~77(8)
C语言代码:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=077;
printf("%d",~a);
}
5、左移运算符(<<):用来将一个数的各个二进制位左移若干位,移动的位数由操作数指定(操作数必须是非负值),其低位空出的位用0填补,高位左移溢出则舍弃该高位。
例如将a=15,即00001111(2)左移2位得:00111100(2)。
C语言代码:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=15;
printf("%d",a<<2);
}
6、右移运算符(>>):用来将一个数的各二进制位右移若干位,移动的位数由非负操作数指定,移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意,对无符号数,右移时左边高位移入0;对于有符号数,要取决于所用的计算机系统。例:a的值是八进制数113755,用二进制形式表示为:
a :1001011111101101(2)
a>>1: 0100101111110110(逻辑右移)
a>>1: 1100101111110110(算术右移)
C语言程序:
#include <stdio.h>
int main(int argc,char**argv)
{
int a=0113755;
printf("%d",a>>1);
}
7、位运算赋值运算符位运算符与赋值运算符可以组成复合赋值运算符。
例如:&=,|=,>>=,<<=,^=
若 a &= b 则相当于 a = a&b
a <<=2 相当于 a = a<<2