我需要按给定顺序显示二进制数列表,但不知道从哪里开始。我唯一注意到的是两个连续数字之间的差异是-1,1,-1,1 ......
00,01,11,10,110,111,101,100,1100,1101,1111,1110,1010,1011,1001,1000,11000,11001,11011,11010,11110,11111,11101,11100,10100,10101,10111,10110,10010,10011,10001,10000,110000,110001,110011,110010,110110,110111,110101,110100,111100,111101,111111,111110,111010,111011,111001,111000,101000,101001,101011,101010,101110,101111,101101,101100,100100,100101,100111,100110,100010,100011,100001,100000
非常感谢任何帮助。
答案 0 :(得分:1)
这是格雷码序列。你可以看到,在任意两个连续数字之间只有一个区别。
你可以做什么?
你可以从第n个二进制数得到第n个格雷码。
假设第n个二进制数的相应格雷码为
b[3] b[2] b[1] b[0]
| | | |
V V V V
g[3] b[3]^b[2] b[2]^b[1] b[1]^b[0]
g[2] g[1] g[0]
所以(g[3],g[2],g[1],g[0])
是灰色代码,现在对应于二进制代码(b[3],b[2],b[1],b[0])
。
此处^
表示xor
操作。
所以这可以用这种方式编写
function grayConverter($bin){
return $bin^ ($bin>> 1); // xorring between the binary value and it's right shift.
}
还有另一种方法可以生成格雷码(列表)。
前两个数字是
0
1
接下来的是
11
10
模式是您创建前2个数字X={0,1}
。您以相反的方式考虑列表X'={1,0}
。然后使用所有X
前置0
。它变为{00,01}
。元素X'
前置1
。
X = X union X' = {00,01,11,10}
。
现在再次使用X
重复相同的过程。这样,您将获得灰色序列中的所有元素。