3.3 位逻辑运算符
51单片机的存储器中有一部分的存储器是允许位操作的,单片机应用系统开发时对I/O端口的操作也是非常频繁的,因此往往要求程序在位(bit)一级进行运算或处理。C51语言直接面对51单片机硬件,提供了强大的位运算功能,使得C语言也能像汇编语言一样用来编写系统程序、单片机控制程序。
C51提供了6种位运算符,见表3-6。
表3-6 位运算符

3.3.1 位运算符
1.按位与运算(参与运算的数以补码方式出现)
(1)清零特定位(mask中特定位置0,其他位为1,s=s&mask)。
例如:把a的高八位清0,保留低八位,a=4560(10001110010000)。
可作&255运算(255的二进制数为0000000011111111):

(2)取某数中指定位(mask中特定位置1,其他位为0,s=s&mask)。
例如:取末三位 |(1101101->101)|x&7
2.按位或运算(参与运算的数以补码方式出现)
常用来将源操作数某些位置1,其他位不变(mask中特定位置1,其他位为0,s=s|mask)。
例如:将数据101100最后一位置1,即实现101100->101101
位运算实现方法:x|1
将数据101101最后一位清0,即实现101101->101100
位运算实现方法:x|1-1
3.按位异或运算(参与运算的数以补码方式出现)
(1)使特定位的值取反(mask中特定位置1,其他位为0,s=s^mask)。(https://www.daowen.com)
例如:9^5的结果为
00001001^00000101 =00001100
(2)不引入第三变量,交换两个变量的值(设a=a1,b=b1),见表3-7。
表3-7 不引入第三变量,交换两个变量的值

4.求反运算
求反运算符“~”为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
例如:~9的运算为
~(0000000000001001)=1111111111110110
3.3.2 移位运算
1.“≪”(左移)
一般形式:操作数1≪操作数2
功能:把“≪”左边的操作数1的各二进制位全部左移若干位,移动的位数由“≪”右边的操作数2决定,移动时高位丢弃,低位补0。
例如:a=00000011(十进制3),执行a≪4,即将a的各二进位向左移动4位,00000011左移4位后为00110000(十进制数48)。
相当于a×2n(n为左移的位数),即3×24=48。
2.“≫”(右移)
一般形式:操作数1≫操作数2
功能:把“≫”左边的操作数1的各二进制位全部右移若干位,移动的位数由“≫”右边的操作数2决定,移动时低位丢弃,如果是正数,高位补0;如果是负数,高位补0或补1,由所用的计算机系统决定。
例如:a=00001111(十进制15),执行a≫2,即将a的各二进位向右移动2位,00001111右移2位后为00000011(十进制数3。)
相当于a/2n(n为右移的位数),即15/22=3。