将十进制值转换为二进制表示形式时,可以使用以下命令:
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}
给你0
和1
。将两块组合起来可以得到2^2
四个可能的值:
$ printf %s\\n {0..1}{0..1}
00
01
10
11
将五个部分组合起来,即可得到2^5
32 个可能的二进制值(从 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
作为要使用的索引传递,因此会回显与您的值相对应的二进制文件。