二进制8bit数,如何有规律的每次变一位产生所有256种组合?

就是每次只能变一位,把一个1换0或把一个0换成1,产生下一个数
EX: 11111111 => 11111110 =>11111100

产生的数要包括00000000~11111111,顺序不限,不能重复

刚好要写個verilog程式,一下想不起有什麽简单規律的方法,请问各位有没有什麽好主意?

推荐  (0) | 6人关注关注
6个答案
30 0

傅里叶变黄油猫软件工程师,应用数学专业

2014-03-26 09:31

将问题一般化:求一个序列,包含所有2^n个n位二进制正整数一次,且相邻元素有且只有一位不同。将这个问题表示为Q(n)。

假设对于Q(n)存在一个解是序列A(n),则对于Q(n+1),可用以下的方法创造A(n+1)

A(n)每一个元素前面加上0,顺序作为A(n+1)的前半。
A(n)每一个元素前面加上1,倒序作为A(n+1)的后半。

例如,对于Q(2),一个解A(2)是:
00
01
11
10

用上面的方法创造Q(3)的解A(3):
000
001
011
010
110
111
101
100

如此递推,即可获得任意n下Q(n)的解。而且这种方法创造的解总是一个漂亮的环。

16 0

这不就是格雷码吗?
算法其实非常简单。这里有各种语言的代码。

2 0
支持者: 方程

在二进制计算器中,从0起每次加1即可,自然序不是最好的吗?(还有必要去想乱序吗?)
等等,每次改最后一位不符题意?
手工可以写出下式,还没想到是什么算法,不足8位的请自动在前面加0脑补:
0,01,11,10,
110,111,101,100,
1100,1101,1111,1110,
1010,1011,1001,1000,
11000,......

请注意最后2位尾数是8个排列的循环(对称):
00、01、11、10、
10、11、01、00。

0 0

饭小盆材料物理学士,飞面神教信徒,FFF团资深团员

2014-03-26 09:31

都顺序不限了那直接顺次加1就好了啊。。。

1 1

方程应用数学专业

2014-03-26 12:56
支持者:

原先我理解错题意了。现在明白后,看看已有回答,其实已经有人(@泡力@傅里叶变黄油猫 )作出了可行的方案。

明白题意后,那个方案立即让我想起这个玩具

九连环

和这个玩具

汉诺塔

它们的算法原理和楼主的问题有共同点:
要修改某个 bit 上的值,都要先遍历比它低的 bit。

汉诺塔的递归版伪码是这样的。
设move函数是将第A个塔上的n各盘经过B塔移动到C塔的过程,那么有
move(n, A, B, C){
move(n-1, A, C, B);
change A to C;
move(n-1, B, A, C);
}
递归终止条件略。

那么楼主的问题可以这样写伪码。
设change函数是将二进制数的第n位(0或1)从一个值(a)修改到另一个值(b)的过程
change(n, a, b){
change(n-1, a, b);
change the nth bit from a to b;
print;
change(n-1, b, a);
}
递归终止条件是n=1时,
change(n, a, b){
change the nth bit from a to b;
print;
}
私下跑了一遍,没发现大问题。就是算法效率在 n 特别大时不太理想。

0 0

你看看电子技术里面的循环码。里面有一种编码就是这样!

其实也用不着这么复杂。。自己写个程序从0开始每次变一位,且变后增长最小即可。

查看更多

添加回答

登录 后回答问题,你也可以用以下帐号直接登录

相关问答

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2018] 6282-492号    新出发京零字第朝200003号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区