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