位运算原本属于汇编语言的功能,由于C语言是介于高级语言和汇编语言之间的一种中间语言,是为开发系统软件而设计的,所以它提供了多种类似于汇编语言的功能。
位运算是指对二进制数按位进行运算。其操作对象是一个二进制位集合,每个二进制位只能存放0或1。例如,一个整型数据占据16个二进制位(2个字节),则最右边的二进制位称为第0位,最左边的二进制位称为最高位。
一、位运算符
C语言提供了6种位运算符,除了“~”为单目运算符以外,其余均为双目运算符,即有2个运算对象。
- ~ 按位求反,如~x,表示对x的二进制数值按位求反。
- & 按位与,如x&y,表示对x,y的二进制数值按位与。
- | 按位或,如x|y,表示对x,y的二进制值按位或。
- ∧ 按位异或,如x∧ y,表示对x,y的二进制值按位异或。
- << 左移,如x<<m,表示对x的二进制值左移m位。
- >> 右移,如x>>m,表示对x的二进制值右移m位。
二、位运算符求值规则
- ~ 按位求反,~0=1,~1=0。
- & 按位与,0&0=0,0&1=0,1&0=0,1&1=1。
- | 按位或,0|0=0,0|1=1,1|0=1,1|1=1。
- ∧ 按位异或,0∧0=0,0∧1=1,1∧0=1,1∧1=0。
- << 左移,00101110<<2,结果10111000。
- >> 右移,00101110>>2,结果00001011。
三、位运算优先级
如果在同一个表达式中出现多种运算符,则它的运算优先级为:
- ~
- << >>
- &
- ∧
- |
(其中1为最高,5为最低)
另外要注意的是:
- 位运算对象只能是整型(int,short,unsigned,long )或字符型(char)数据。
- 左移的规则是将二进制数向左移动若干位,左边移走的高位被丢弃,右边被空出来的低位补零。
- 右移的规则是将二进制数向右移动若干位,右边移走的地位被丢弃,左边被空出来的高位补零。
- 对于无符号整数来讲,左端空出的高位。而对于有符号的数来讲,如果符号位为0(即正数),则被空出来的高位部分补零。如果符号位为1(即负数),则被空来的高位部分补0还是补1,与使用的计算机系统有关,有的计算机系统补0,称为“逻辑右移”,有的计算机系统补1,称为“算术右移”。
- 为了简化程序并提高编译效率,C语言还允许在赋值运算符“=”左边加上位运算符,构成位复合赋值运算符。
x&=y ,等价于x=x&y ,
x|=y ,等价于x=x|y
x∧=y ,等价于 x=x∧ y
x<<=y,等价于x=x<<y
x>>=y,等价于x=>>y
先计算位运算,在将运算结果重新赋给x。