Dificuldade de conversão de binário para hexadecimal usando bc

4

Eu li como calcular usando a calculadora da linha de comando e um documento AQUI, mas mesmo assim não obtive o que esperava e não consigo encontrar o meu erro, o que eu fiz no shell foi:

bc << HERE
>ibase=2
>obase=16
>1001
>HERE
100

Eu esperava obter 9 como resultado, já que o binário 1001 é hexadecimal 9, mas eu tenho 100.

    
por Abdul Al Hazred 25.03.2015 / 19:25

4 respostas

3

Como você define ibase=2 primeiro, é necessário usar obase=10000 :

$ echo 'ibase=2; obase=10000; 1001' | bc
9
    
por 25.03.2015 / 19:31
6

Como você está configurando a base de entrada primeiro, quando você define a base de saída, o 16 será interpretado de acordo com a base de entrada (2). Parece que o 6 em 16 é simplesmente interpretado como um bit 1 binário neste caso, e assim a base de saída é definida como binária 11 ou decimal 3.

Para resolver isso, você pode definir a base de saída antes de definir a base de entrada:

echo 'obase=16; ibase=2; 1001' | bc
    
por 25.03.2015 / 19:38
1

Enquanto você sempre pode fatorar declarações para [io]base= com base na base de entrada atual, outra coisa que você pode fazer é usar a notação hexadecimal explícita, que deve funcionar independentemente da base de entrada. Assim:

printf %s\n ibase=2 obase=F 1001 | bc

... que imprime ...

9

Você pode achar que isso pode ser especialmente útil se você se perder ao configurar bases de entrada, porque você sempre pode voltar a uma base simples 10 com a mesma facilidade:

ibase=A

Esta é uma sintaxe padronizada como obrigatória por POSIX :

  • Quando ibase ou obase é atribuído a um único dígito da lista em Convenções Lexicais em bc , o valor deve ser assumido em hexadecimal. (Por exemplo, ibase=A define como base dez, independentemente do valor atual ibase .) Caso contrário, o comportamento é indefinido quando dígitos maiores ou iguais ao valor de ibase aparecerem a entrada. Ambos ibase e obase devem ter valores iniciais de 10.

Esta é uma convenção histórica que começou com dc (para o qual, em alguns sistemas, bc ainda é pouco mais que um front-end) e assim ...

echo 2i Fo 1001p|dc

... também imprime ...

9
    
por 26.03.2015 / 02:01
0

Link: cálculos de linha de comando usando bc | basicamente tech

NOTA: Você deve colocar primeiro obase e, em seguida, ibase .

So you need to use hex first to "break out" of binary mode.

me@pc:~$ bc << HERE
> obase=16
> ibase=2
> 1001
> HERE
9

me@pc:~$ bc << HERE
> obase=16
> ibase=2
> 1001
> 111
> 1111
> 11111111
> HERE
9
7
F
FF
    
por 21.04.2015 / 23:24