Bash 十进制到二进制转换说明

Bash 十进制到二进制转换说明

将十进制值转换为二进制表示形式时,可以使用以下命令:

val=12
D2B=({0..1}{0..1}{0..1}{0..1}{0..1})
echo ${D2B[$val]}

虽然这有效,但我无法理解或找出为什么会这样做。如果有人可以解释它或向我指出一个可以做到这一点的资源,那就太好了。

答案1

支撑扩张in form{x..y}为您提供从 x 到 y 范围内的所有可能的字符。在这种情况下,{0..1}给你01。将两块组合起来可以得到2^2四个可能的值:

$ printf %s\\n {0..1}{0..1}
00
01
10
11

将五个部分组合起来,即可得到2^532 个可能的二进制值(从 0 到 32):

$ printf %s\\n {0..1}{0..1}{0..1}{0..1}{0..1}
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
.....
11110
11111

将所有值保存在D2B数组中,十进制索引与其二进制值相对应。访问索引 12${D2B[$val]}会得到十进制 12 的二进制值。

实际上,你可以用以下方法缩短它{x,y}

D2B=({0,1}{0,1}{0,1}{0,1}{0,1})

答案2

首先,请注意,这是一种内存效率很低的方法。相反,您可以考虑以下问题的答案问题。


至于你的问题,不过...

D2B=({0..1}{0..1}{0..1}{0..1}{0..1})

此行创建一个名为 的数组D2B,其中包含从 00000 到 11111 的所有可能的二进制值。大括号扩展的工作方式如下:

% printf '%s %s %s\n' {0..2}{0..2}{0..2} 
000 001 002
010 011 012
020 021 022
100 101 102
110 111 112
120 121 122
200 201 202
210 211 212
220 221 222

由于大括号扩展在连接时从第一个扩展到最后一个,因此数组看起来像这样:

00000 00001 00010 .... 11101 11110 11111

这些值的索引对应于其中包含的二进制值,因为在这里,大括号扩展和数字的数学表示使用相同的规则。

因此,索引 0 是00000,索引 5 是00101,依此类推。由于您$val作为要使用的索引传递,因此会回显与您的值相对应的二进制文件。

相关内容