Como você define ibase=2
primeiro, é necessário usar obase=10000
:
$ echo 'ibase=2; obase=10000; 1001' | bc
9
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.
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
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 :
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
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
Tags command-line bc