quinta-feira, 12 de julho de 2007

Bases Numericas em Bash

Com Bash, podemos representar números nas mais variadas bases, desde 2 até 64 usando o operador # como no exemplo abaixo:


X=101
for BASE in 2 8 10 16 32 64 ; do
echo "$X na base $BASE eh $(( ${BASE}#${X} ))" # conversao pra decimal
done
101 na base 2 eh 5
101 na base 8 eh 65
101 na base 10 eh 101
101 na base 16 eh 257
101 na base 32 eh 1025
101 na base 64 eh 4097

echo $((16#FF)) $((32#V))
255 31

echo $((64#z)) $((64#Z)) $((64#@)) $((64#_)) # atenção nos 2 ultimos!
35 61 62 63

Além de ser possível usar a notação de octal e hexa do C (iniciar a expressão com 0 e 0x, respectivamente)
echo $((10)) $(( 010 )) $(( 0x10 )) $((10 + 010 + 0x10))
10 8 16 34

Bastante útil para pequenas conversões. Agora se quisermos converter um numero de uma base qualquer para outra, o nosso amigo bc pode servir:

bc <<< 'ibase = 8 ; obase = 16 ; 1027'
2A3

Onde ibase é a base de entrada (input) e a obase é a de saída (output). A diferença fica nas bases muito altas (32 ou 64) onde não são usados os caracteres minúsculos, maiusculos e especiais.

Esta dica foi tirada do Advanced Bash Scripting Guide.


Contador de visitas

3 comentários:

naoliv disse...

Isso tá certo?
Como que o número pode ser 5 na base 2? (se só existem os caracteres 0 e 1)

101 em hexa (base 16), por exemplo, é 65 e não 257.

Ou eu entendi errado o seu post?

naoliv disse...

Hum... comentando com um amigo meu eu acho que você quis dizer:

101 na base 2 eh 5 na base 10

101 na base 8 eh 65 na base 10

101 na base 10 eh 101 na base 10

101 na base 16 eh 257 na base 10

101 na base 32 eh 1025 na base 10

101 na base 64 eh 4097 na base 10

Faltou os "na base 10" :-)

Tiago "PacMan" Peczenyj disse...

Ola!

Se vc prestar atenção eu coloquei um comentário que informava a conversão para a base decimal pois achei q, se colocasse o 'na base 10' no final de cada linha poderia ficar um pouco poluido. Pelo visto ficou é confuso.

agora, 101 em hexa é 257 sim, uma vez que 100 significaria, nesse caso, 1 x 16^2 -- 256. Vou postar mais sobre o assunto ai e vai vamos chegar a um consenso ;-)