关于循环算法的进一步思考

mqcy18 2010-09-03 03:37:26

http://topic.csdn.net/u/20100831/18/7dbcbc1a-13bb-434d-9084-f8b146cdb963.html#replyachor
帖中,讨论了一个位的相对循环的算法,一个16位的数,只在其中的10位做相对循环,如果要象下面两个位或者多个位循环,用变量控制位的亮灯数,虽然难度大了些,但更有趣、更有挑战性。

 
ssooo oooss oooooo
ossoo oosso oooooo
oosso ossoo oooooo
oooss ssooo oooooo
sooos sooos oooooo
ssooo oooss oooooo
ossoo oosso oooooo //s表示灯亮,o表示灯不亮, 如此循环
oosso ossoo oooooo
oooss ssooo oooooo
sooos sooos oooooo
ssooo oooss oooooo
ossoo oosso oooooo
oosso ossoo oooooo
oooss ssooo oooooo

请高手来玩一下。
...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mqcy18 2010-09-06
  • 打赏
  • 举报
回复
虽然还没有完全明白,但得到了一个非常好的思路,就是用字符循环来处理,非常感谢!
mqcy18 2010-09-05
  • 打赏
  • 举报
回复
高人出手 ,精彩分呈,实在不好意思,对这位大侠解法不太理解,能否讲解一下。
[Quote=引用 8 楼 great_bug 的回复:]
C/C++ code

unsigned char ptn1[] = {0x18,0xc,6,3,0x11};
unsigned char ptn2[] = {3,6,0xc,0x18,0x11};
#define led_show(ndx1,ndx2) (ptn1[(ndx1)%5]<<(5+6))+(ptn2[(ndx2)%5]<<6)
[/Quote]
Great_Bug 2010-09-05
  • 打赏
  • 举报
回复
你用两个变量(ndx1,ndx2)控制两个区域的灯。变量如果是递增或递减的,灯就是循环的。
两个变量可以相同。
shizhiyong001 2010-09-03
  • 打赏
  • 举报
回复
高手啊 学习
现在还是人类 2010-09-03
  • 打赏
  • 举报
回复

//GetLEDWORD(5,2,0);
//GetLEDWORD(5,2,1);
//...
//GetLEDWORD(5,3,0);
//GetLEDWORD(5,3,1);
//GetLEDWORD(5,3,2);
//...
//GetLEDWORD(6,3,0);
//GetLEDWORD(6,3,1);
//...

WORD GetLEDWORD(BYTE bitCount, BYTE LEDCount, BYTE Index)
{
WORD retWORD = 0;
BYTE i = 0;
BYTE j = 0;
BYTE BBAnd = 0;
BYTE AAAnd = 0;
BYTE AA = 0;
BYTE BB = 0;
if(bitCount>8){
//连续灯的二进制位不能大于8,不然就不好分字节了,返回错误
return 0;
}
//初始化两个字节的内容
for(i=0;i<LEDCount;i++){
AA = AA << 1;
BB = BB >> 1;
AA = AA ^ 1;
BB = BB ^ 0x80;
}
//初始化BB的与运算参数
for(i=0;i<bitCount;i++){
BBAnd = BBAnd >> 1;
BBAnd = BBAnd ^ 0x80;
AAAnd = AAAnd << 1;
AAAnd = AAAnd ^ 1;
}

if(Index>=(bitCount+LEDCount)){
//Index参数范围超出循环滚动的范围,返回错误
return 0;
}
if(bitCount-Index<LEDCount){
//当移动的数量在bit宽度以外
j = bitCount - LEDCount;
//先将字节移到边缘
AA = AA << j;
BB = BB >> j;
//再移动超出部分
for(i=j;i<Index;i++){
AA = AA << 1;
AA = AA ^ 1;
AA = AA & AAAnd;
BB = BB >> 1;
BB = BB ^ 0x80;
BB = BB & BBAnd;
}
}else{
AA = AA << Index;
BB = BB >> Index;
}


//开始合并两个字节为一个字节
retWORD = BB;
retWORD = retWORD << (bitCount -(8-bitCount));
retWORD = retWORD | AA;
retWORD = retWORD << (16-(bitCount*2));
return retWORD;
}
barryan2007 2010-09-03
  • 打赏
  • 举报
回复
学习一下
mqcy18 2010-09-03
  • 打赏
  • 举报
回复
感谢楼上的热心解答,这帖的关键是用变量控制亮灯的个数,如果遇到一边亮3只灯的情况,这个程序就不适应了
 
sssoo oosss oooooo
ossso ossso oooooo
oosss sssoo oooooo
sooss ssoos oooooo
ssoos sooss oooooo
sssoo oosss oooooo
ossso ossso oooooo //s表示灯亮,o表示灯不亮, 如此循环
oosss sssoo oooooo

现在还是人类 2010-09-03
  • 打赏
  • 举报
回复

typedef unsigned char BYTE;
typedef unsigned int WORD;
WORD GetLEDInt(BYTE Index)
{
WORD retWORD = 0;
BYTE AA = 0;
BYTE BB = 0;
if(Index>4){
//Index参数范围在 0 到 4 之间,若大于 4,当 0 处理
return 0xC0C0; //二进制 1100000011000000
}
AA = 0x03; //二进制 00000011
BB = 0xC0; //二进制 11000000
AA = AA << Index;
BB = BB >> Index;
if(Index==4){
BB = BB ^ 16;
AA = AA ^ 1;
}
//开始合并两个字节为一个字节
retWORD = BB;
retWORD = retWORD << 2;
retWORD = retWORD | AA;
retWORD = retWORD << 6;
return retWORD;
}
mqcy18 2010-09-03
  • 打赏
  • 举报
回复
用C++表达即可,算法在于思想,语法都是相通的。
lbing7 2010-09-03
  • 打赏
  • 举报
回复
这贴我看过,这个算法不难,对我来说难的是我不知道在PLC下如何表达,呵呵
Great_Bug 2010-09-03
  • 打赏
  • 举报
回复

unsigned char ptn1[] = {0x18,0xc,6,3,0x11};
unsigned char ptn2[] = {3,6,0xc,0x18,0x11};
#define led_show(ndx1,ndx2) (ptn1[(ndx1)%5]<<(5+6))+(ptn2[(ndx2)%5]<<6)

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧