前面的各种运算都是以字节为最基本存贮单元进行操作的。但在很多系统程序中常常要求再位遗迹进行运算或者处理。c语言提供了6种位运算符
&按位进行与运算
|按位进行或运算
^按位进行异或运算
~按位进行取反运算
<<按位进行左移
>>按位进行右移
注意只有~是单目运算符(只需一个操作数),其他的都是双目运算符(需要2个操作数),位运算符的操作数只能是整形或者字符型,不能使其他类型的数据
1&运算符
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=9,b=5,c;
c=a&b;
printf("%d&%d=%d\n",a,b,c);
system("PAUSE");
return 0;
}
按位与运算符通常用来对某些位清零或者保留某些位,例如将a的高8位清0,只保留低8位
2按位或运算
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=9,b=5,c;
c=a|b;
printf("%d|%d=%d\n",a,b,c);
system("PAUSE");
return 0;
}
3按位异或运算符
功能是按参与运算的两数各对应的二进制进行异或运算,当对应的二进制相异时,结果为1,否则结果为0;
0^0=0;
1^0=1;
0^·1=1;
1^1=0;
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=9,b=5,c;
c=a^b;
printf("%d^%d=%d\n",a,b,c);
system("PAUSE");
return 0;
}
4求反运算符~
为单目运算符
计算机内部是以补码的形式表示一个数,由补码求原码的规则如下:
1正数的原码与补码相同
2负数的原码是除符号外,各位取反,再加1
例如111111111110110的原码是
100000000001010
其中最高位是符号位,1表示负数,0表示正数,可知100000000001010为10进制数的-10
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=9,b;
b=~a;
printf("~%d=%d\n",a,b);
system("PAUSE");
return 0;
}
5左移运算符<<
左移运算符是双目运算符,功能是将<<左边的操作数的各二进制位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补0
设a=3,计算a<<4,a的二进制可表示为00000011,将00000011左移4位后为00110000(十进制48)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=3,b=4,c;
c=a<<b;
printf("%d<<%d=%d\n",a,b,c);
system("PAUSE");
return 0;
}
6右移运算符
右移运算符是双目运算符,功能是将>>右边的操作数的各二进制全部右移若干位,>>右边的数指定移动的位数,应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0,或是补1取决取决于编译系统的规定,大多数系统规定为补1
设a=15,计算a>>2
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=15,b=2,c;
c=a>>b;
printf("%d>>%d=%d\n",a,b,c);
system("PAUSE");
return 0;
}