Bash 10進数から2進数への変換ガイドライン

Bash 10進数から2進数への変換ガイドライン

10進値を2進表現に変換するときは、次のコマンドを使用できます。

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}が提供されます。 2 つのブロックを組み合わせると、4 つの可能な値が生成されます。012^2

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

5つの部分を組み合わせると、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バイナリ値に対応する10進インデックスを使用して配列に保存します。インデックス12にアクセスすると、${D2B[$val]}10進数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使用するインデックスとして渡されるため、その値に対応するバイナリがエコーされます。

関連情報