php - 按给定顺序生成二进制数

标签 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

非常感谢任何帮助。

最佳答案

这是格雷码序列。你可以看到任何两个连续的数字之间只有一个不同。

你能做什么?

可以从第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/

相关文章:

c - 十进制数的循环二进制

包含二进制可执行文件的 Bash 脚本

php - Yii accessRules 表达式不起作用

php - 在 ProviderRepository.php 第 208 行中找不到提供程序类

c# - 如何修复代码以便 C# 中的斐波那契搜索算法正常​​工作

JavaScript 迷宫代码失败

c - 这个奇怪的函数将字符串转换为二进制吗?

php - 如何将变量从php页面传递给javascript并显示数据

php - MySQL 在终端中工作,但在 PHP 中不工作

PHP Group 数组值然后求和