按位与运算的操作符是“&”,与运算是在两个操作数的对应位进行逻辑与运算,对应位全为1时结果为1,有0则结果为0。例如,假设有一个外部传感器通过串行链接向你发送到开发板的数据,为了节省时间,传感器将两条信息打包到每个字节。假设低半字节(4位称为半字节,就像8位称为字节一样)包含传感器数据,高半字节包含生成数据的传感器编号。
在代码中,按位与可能如下所示:
byte a=10;//00001010
byte b=6;//00000110
byte c=a&b;//00000010=c
请注意,仅当两个操作数位均为1时,结果位的值才为1。
在表3-2中,你看到了字节中包含的位是如何解释的。传感器设备发送了8位数据:
00110101
开发板接收到数据后,如何确定数据是什么以及哪个传感器发送了数据?硬件规定告诉你,低4位保存数据,高4位保存发送数据的传感器编号。我们可以使用位“掩码” 来分离数据以提取信息。由于按位与运算结果,位的条件是当且仅当数据和掩码的位位置均为1,下面的二进制数据,第一个传感器数据,第二个是低四位掩码数据,第三个是通过掩码提取的低四位数据:
00111010//The sensor data--operand1(www.xing528.com)
00001111//The low nibble mask--operand2
00001010//Bitwise AND result using the two operands
掩码中的低位4位都设置为1,经过逻辑与运算后得到低四位中保存的数据。数据中最右边的位是逻辑0,但掩码的低位是1。由于按位与在两个操作数位均为1时的位值仅为1,因此结果的低位为0。数据中的第二位是1,但掩码中仍为1。按位1加1的结果总是1,因此第二位的结果是1。串行数据字节(操作数1)中的第三位为0,而掩码(操作数2)为1,因此,结果为0。第四位在数据中为1,在掩码中为1,因此结果为1。因为我们在查找数据时不关心高半字节,所以掩码的其余部分都是0。如果看表3-2,应知道二进制值为00001010的十进制值为10。现在你知道传感器发送的数据值为10。
那么,是哪个传感器发送的数据?设备文档说明传感器编号保存在高四个中。要确定这一点,请重新定义掩码以查看高四位:
00111010//The data
11110000//The high nibble mask
00110000//Bitwise AND result
如果只查看高四位(即0011),则可以看到这表示设备的传感器编号3(稍后你将确切了解如何提取此信息)。如你所见,按位与通常用于从数据中去除未使用的位,以便提取所需的信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。