Bash decimal para explicação de conversão binária

2

Ao converter valores decimais em sua representação binária, é possível usar os seguintes comandos:

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

Enquanto isso funciona, não consigo entender ou descobrir por que isso acontece. Seria ótimo se alguém pudesse explicá-lo ou me indicar um recurso que o faça.

    
por iyiyy 12.05.2015 / 19:47

2 respostas

3

Expansão de cinta no formulário {x..y} dê a você todos os caracteres possíveis de alcance x para y. Nesse caso, {0..1} fornece 0 e 1 . Combine duas partes com 2^2 de quatro valores possíveis:

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

Combine cinco partes com 2^5 trinta e dois valores possíveis de 0 a 32 na forma binária:

$ 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

Salvando todos os valores em D2B array, com o índice decimal correspondendo a este valor binário. O índice de acesso 12 ${D2B[$val]} forneceu o valor binário de 12 decimais.

Na verdade, você pode torná-lo mais curto com {x,y} :

D2B=({0,1}{0,1}{0,1}{0,1}{0,1})
    
por 12.05.2015 / 19:56
2

Primeiro, observe que essa é uma maneira bastante ineficiente de fazer isso. Você pode, em vez disso, considerar as respostas em esta pergunta.

Quanto à sua pergunta, embora ...

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

Esta linha cria uma matriz chamada D2B que contém todos os valores binários possíveis de 00000 a 11111. As expansões de chaves funcionam assim:

% 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

Devido ao fato de as expansões de chaves serem expandidas do primeiro para o último quando elas são contíguas, o array é parecido com isto:

00000 00001 00010 .... 11101 11110 11111

Os índices desses valores correspondem aos valores binários contidos neles, já que aqui as expansões de chave e as representações matemáticas dos números usam as mesmas regras.

Assim, o índice 0 é 00000 , o índice 5 é 00101 e assim por diante. Como você passa $val como o índice a ser usado, o binário correspondente ao seu valor é ecoado.

    
por 12.05.2015 / 19:59