前面介绍的各种运算都是以字节(byte)为基本单位进行的,然而,有些系统程序中要在位(bit)一级进行运算处理。这正是C语言具有低级语言功能的体现,这使得C语言也能像机器或汇编语言那样用来编写系统级程序。所谓位运算,是指进行二进制位的操作。
学习本章后将学会位一级操作数据,给数据操作提供更多灵活性与独特性。
C语言位运算符
C语言提供了六种位运算符:
1.&按位与
2. | 按位或
3.^按位异或
4. ~取反
5.<< 左移
6.>> 右移
位运算运算规则
B1 | B2 | B1&B2 | B1|B2 | B1^B2 | ~B1 | I1<<I2 | I1>>I2 |
0 | 0 | 0 | 0 | 0 | 1 | I1二进制形式左移I2位(相当于I1*2^I2) | I1二进制形式左移I2位(相当于I1*2^-I2) |
0 | 1 | 0 | 1 | 1 | 1 | ||
1 | 0 | 0 | 1 | 1 | 0 | ||
1 | 1 | 1 | 1 | 0 | 0 |
下面分别具体介绍
按位与运算
按位与运算符&是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进制均为1时,结果位才为1,否则为0.参与运算的数以补码方式出现。例如9&5可写算式如下:
00001001(9的二进制补码)
& 00000101(5的二进制补码)
00000001(1的二进制补码)
可见,9&5=1.
按位与运算通常用来对某些位清0或保留某些位。例如,把a的高8位清0,保留低8位,可作a&255运算()
与运算举例:
#include<iostream>
using namespace std;
int main(){
inta=9;
intb=5;
intc;
c=a&b;
cout<<c;
return0;
}
2.按位或运算
按位或运算符“|”是双目运算符,其功能是参与运算的两数各对应的二进位相或,只要对应的两个二进位有一个为1时,结果位就为1,参与运算的两个数均以补码出现,例如,9|5可写算式如下:
00001001(9的二进制补码)
| 00000101(5的二进制补码)
000001101(13的二进制补码)
可见,9|5=13。
或运算举例:
#include<iostream>
using namespacestd;
int main(){
int a=9;
int b=5;
int c;
c=a|b;
cout<<c;
return 0;
}
3.按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,
当两对应的二进制相异时,结果为1,参与运算数仍以补码出现,例如,9^5可写成算式如下:
00001001(9的二进制补码)
| 00000101(5的二进制补码)
000001100(12的二进制补码)
#include<iostream>
using namespace std;
int main(){
inta=9;
intb=5;
intc;
c=a^b;
cout<<c;
return0;
}
4.求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。例如,~9的运算为~(0000000000001001),结果为1111111111110110.(-10的补码)
#include<iostream>
using namespace std;
int main(){
inta=9;
intb=5;
intc=9;
c=~c;
cout<<c;
return0;
}
输出:-10
左移运算
左移运算符“<<”是双目运算符。其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0.
例如,a<<4指把a的各二进位向左移动4位。如a=00000011(十进制为3),左移4位后为00110000(十进制是48).
右移运算:
右移运算符“>>”是双目运算符。其功能是把”>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。例如,设a=15,a>>2,表示把00001111右移为00000011(十进制3)
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0.而为负数时。符号位为1.最高位是补0或是补1取决于编译系统的规定。