我需要按给定顺序显示二进制数列表,但不知道从哪里开始。我唯一能注意到的是,两个连续数字之间的差异顺序为 -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
非常感谢任何帮助。
最佳答案
这是格雷码序列。你可以看到任何两个连续的数字之间只有一个不同。
你能做什么?
可以从第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
重复相同的过程。这样您将获得灰色序列中的所有元素。
关于php - 按给定顺序生成二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247860/