按给定顺序生成二进制数

时间:2017-11-12 10:44:47

标签: php algorithm binary

我需要按给定顺序显示二进制数列表,但不知道从哪里开始。我唯一注意到的是两个连续数字之间的差异是-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

非常感谢任何帮助。

1 个答案:

答案 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重复相同的过程。这样,您将获得灰色序列中的所有元素。