bc를 사용하여 2진수를 16진수로 변환하는 데 문제가 있습니다.

bc를 사용하여 2진수를 16진수로 변환하는 데 문제가 있습니다.

여기에서 명령줄 계산기와 설명서를 사용하여 계산을 수행하는 방법을 읽었지만, 그럼에도 불구하고 예상한 결과를 얻지 못하고 오류를 찾을 수 없습니다. 셸에서 수행한 작업은 다음과 같습니다.

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

2진수 1001은 16진수 9이므로 결과적으로 9가 나올 것으로 예상했는데 100이 나왔습니다.

답변1

입력 베이스를 먼저 설정하고 출력 베이스를 설정하면 16은 입력 베이스(2)로 해석됩니다. 이 경우 6in은 16단순히 이진수 비트로 해석되는 것처럼 보이 1므로 출력 베이스는 이진수 11 또는 십진수 3으로 설정됩니다.

이 문제를 해결하려면 입력 베이스를 설정하기 전에 출력 베이스를 설정할 수 있습니다.

echo 'obase=16; ibase=2; 1001' | bc

답변2

먼저 설정 했기 때문에 다음을 ibase=2사용해야 합니다 obase=10000.

$ echo 'ibase=2; obase=10000; 1001' | bc
9

답변3

[io]base=현재 입력 기반을 기반으로 선언을 항상 인수분해할 수 있지만,다른여러분이 할 수 있는 일은 명시적인 16진수 표기법을 사용하는 것 뿐이며 입력 기준에 관계없이 작동해야 합니다. 이와 같이:

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

...인쇄...

9

입력 기수를 설정할 때 길을 잃은 경우 다음과 같이 항상 간단한 기수 10으로 쉽게 되돌릴 수 있으므로 이 기능이 특히 유용할 수 있습니다.

ibase=A

이것은 표준화된 구문입니다.POSIX에 의해 시행됨:

  • ibase또는obase 목록에서 단일 숫자 값이 할당되는 경우어휘 규칙에서는 bc값이 16진수로 가정되어야 합니다.(예를 들어 ibase=A현재 ibase값과 관계없이 10진수로 설정합니다.)ibase그렇지 않으면 값보다 크거나 같은 숫자가 입력에 나타날 때 동작이 정의되지 않습니다. 합계의 ibase초기 값 obase은 10입니다.

시작된 역사적인 회의입니다.dc (일부 시스템에서는 bc여전히 프런트엔드에 지나지 않습니다.)그래서...

echo 2i Fo 1001p|dc

...또한 인쇄됩니다...

9

관련 정보