序言
还记得我们之前实现的流水灯吧,点这里查看,通过位运算,我们可以轻易的实现流水灯效果,本篇文章,我们对上次的效果进行升级,将实现LED两边往中间点亮的效果。
注:本文位运算用到了左移、右移、取反,如果对位运算不了解,可以看【信奥赛·算法基础】CSP-J 位运算一文
实现
为了实现LED由两边往中间点亮的效果,我们先来分析每一组的二进制数据:
轮数 | 二进制数 |
---|---|
1 | 0111 1110 |
2 | 1011 1101 |
3 | 1101 1011 |
4 | 1110 0111 |
- 接下来针对第一轮数据进行分析
- 先对
0111 1110
取反,得到1000 0001
- 将第一步得到的数据右移,得到
0100 0000
- 将第一步得到的数据左移,得到
0000 0010
- 将第二步第三步得到的数据进行与运算得到
0100 0010
- 显然,到了第4步,就已经能正常计算出第二轮的二进制数据了
- 先对
示例
#include <stc89c5xrc.h>
#define LED P2
void Delay(unsigned int ms)
{
unsigned char i, j;
while(ms--) {
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{
int i = 0;
unsigned char x = 0x7e;
while(1)
{
while(++i < 4)
{
LED = x;
unsigned char temp = ~x;
unsigned char a = temp >> 1;
unsigned char b = temp << 1;
x = a & b;
Delay(100);
}
}
}