(二)任务目标
根据任务描述编写程序。
知识准备
数据在计算机内部都是以二进制形式存储的,在C语言中,针对数据的二进制位进行的运算称为位运算。
单片机通常使用I/O口控制外部设备完成相应的功能,比如LED灯的亮灭、蜂鸣器的鸣响、继电器的通断、电动机的转动停止、水泵的抽水与否、门禁的开关等,这些都可以使用位运算来实现。
在C语言中共有6种位运算符,见表4-9。
表4-9 位运算符
续表
例如:
① 运算符“&”(表4-10),C语言中表示“按位与”运算。
表4-10 运算符“&”
② 运算符“|”(表4-11),C语言中表示“按位或”运算。
表4-11 运算符“|”
③ 运算符“~”(表4-12),C语言中表示“取反”运算,将数据的二进制位翻转,即0变1,1变0。
表4-12 运算符“~”
④ 运算符“^”(表4-13),C语言中表示“按位异或”运算。与0相^的位,保留原值;与1相^的位,值翻转。
表4-13 运算符“^”
⑤ 运算符“<<”(表4-14),左移运算符,将一个数的各个二进制位全部左移若干位。移位过程中,高位丢弃,低位补0。
表4-14 运算符“<<”
⑥ 运算符“>>”(表4-15),右移运算符,将一个数的各个二进制位全部右移若干位。移位过程中,低位丢弃,最高位为0的数,高位补0;最高位为1的数,高位补1。
表4-15 运算符“>>”
位运算的巧妙应用:
①“按位与”&常将一个数的二进制形式中的特定位清0或者保留原值。 比如:
如果要使D0、D2点亮,其余LED灯保持原来的状态不变(即,使LED灯的第0、2位清0,其余位保留原来的值),可以使用表达式led & 0xFA来实现。
②“按位或”|常将一个数的二进制形式中的特定位置1。
比如:
如果要使D7、D6熄灭,其余LED灯保持原来的状态不变(即,使LED灯的第7、6位置1,其余位保留原来的值),可以使用表达式led | 0xC0来实现。
③ 取反。
④ 根据“与0相^的位,保留原值;与1相^的位,值翻转”的特点,“按位异或”^的应用,使一个数据的特定位翻转,其余位保留原值。
⑤ 左移。
⑥ 右移。