bc로 변환 할 경우 "ibase"및 "obase"를 이해합니까?


22

나는 종종 bc16 진수를 10 진수로 변환하거나 그 반대로 변환 하기 위해 유틸리티를 사용 합니다. 그러나 구성 방법 ibaseobase구성 방법은 항상 약간 시행 착오 입니다. 예를 들어 16 진수 값 C0을 10 진수로 변환하고 싶습니다.

$ echo "ibase=F;obase=A;C0" | bc
180
$ echo "ibase=F;obase=10;C0" | bc
C0
$ echo "ibase=16;obase=A;C0" | bc
192

여기의 논리는 무엇입니까? obase( A내 세 번째 예에서)는 변환 된 값 ( C0내 예에서)과 같은 기준에 있어야 하며 ibase( 16제 세 번째 예에서)는 내가 변환 할 기준에 있어야합니까?


1
16 진수 계산 (입력 및 16 진수 출력) ibase 전에 obase를 설정해야합니다!
Paschalis

답변:


36

실제로 말하고 싶은 것은 :

$ echo "ibase=16; C0" | bc
192

16 진수를위한, 그리고 :

$ echo "obase=16; 192" | bc
C0

10 진수를 16 진수로

당신은 모두를 제공 할 필요가 없습니다 ibaseobase10에 이러한 설정의 기본 이후, 진수 관련된 모든 변환.

당신은 않는 등의 바이너리 - 투 - 진수로 변환 모두를 제공해야합니다. 이 경우 먼저 제공하면 이해하기가 가장 쉽습니다 obase.

$ echo "obase=16; ibase=2; 11000000" | bc
C0

ibase대신 먼저 제공 하면 다음 obase설정 의 해석이 변경 되므로 명령이 다음과 같아야합니다.

$ echo "ibase=2; obase=10000; 11000000" | bc
C0

이 순서대로 obase값은 이진수로 해석되므로 16 진수로 출력하려면 10000₂ = 16을 주어야합니다. 서투른입니다.


이제 세 가지 예제가 동작하는 이유를 알아 봅시다.

  1. echo "ibase=F;obase=A;C0" | bc

    180

    POSIX에 따르면 한 자리 값이 16 진수로 해석되므로 입력 기준을 15로 설정하고 출력 기준을 10으로 설정합니다 . 이것은 bcA0 = 10에있는 C0 base이 무엇인지 알려주고, 180₁₀에 정확하게 응답하고 있습니다.

  2. echo "ibase=F;obase=10;C0" | bc

    C0

    이것은 기수 15의 널 변환입니다.

    왜? 첫째, F이전 예제에서 지적했듯이 한 자리는 16 진수로 해석 되기 때문 입니다. 그러나 이제 15로 설정 했으므로 다음 출력 기본 설정이 그런 식으로 해석되고 10₁₅ = 15이므로 C0₁₅에서 C0₁₅로 널 변환됩니다.

    맞습니다. 출력은 16 진법이 아니라 15 진법입니다!

    F0대신 변환을 시도하여이를 스스로 증명할 수 있습니다 C0. F밑면 15 에는 숫자 가 없기 때문에 에 bc고정 하고 출력으로 E0제공 E0합니다.

  3. echo "ibase=16; obase=A; C0"

    192

    이것은 실제 사용이 가능한 세 가지 예 중 유일한 것입니다.

    입력 기반을 먼저 16 진수로 변경 하므로 더 이상 POSIX 사양을 파헤쳐 서이 A경우 16 진수로 해석되는 이유를 이해할 필요가 없습니다 . 이것의 유일한 문제는 출력베이스를 A₁₆ = 10으로 설정하는 것이 중복된다는 것입니다. 그것이 기본값이기 때문입니다.


7

설정 ibaseobase동일한베이스 에 설정해야 함을 의미합니다 . 예제를 설명하면 다음과 같이 표시됩니다.

echo "ibase=F;obase=A;C0" | bc

bc"ibase = F"를 사용하여 15 진수로 표시된 입력 번호를 고려하도록 설정 했습니다. "obase = A"는 출력 번호를 10 진수로 설정합니다. 이것이 기본값입니다.

bc C0을 기본 15 숫자로 읽습니다 : C = 12. 12 * 15 = 180.


echo "ibase=F;obase=10;C0" | bc

이 경우 입력을 기준 15로 설정하고 출력을 기준 15에서 10으로 출력하므로 출력 기준은 15입니다. 기준 15의 C0 입력은 기준 15의 C0 출력입니다.


echo "ibase=16;obase=A;C0" | bc

입력을베이스 16으로 설정하고,베이스 10으로 출력합니다 (베이스 16의 A는베이스 10의 10입니다).

밑이 10으로 변환 된 C0는 12 * 16 = 192입니다.


내 개인 규칙은 obase를 먼저 설정하여 base 10을 사용할 수 있도록하는 것입니다. 그런 다음 base 10을 사용하여 ibase를 설정하십시오.

참고 bc수행은 아이러니 예외가 있습니다 ibase=Aobase=A항상에서베이스 (10)에 입력과 출력을 설정 bc매뉴얼 페이지

Single digit numbers always have the value of the digit 
regardless of the value of ibase.

이 동작의 사양에 모시는 bc사람 : 2004 오픈 그룹의 bc사양 :

When either ibase or obase is assigned a single digit value from 
the list in 'Lexical Conventions in bc', the value shall be assumed
in hexadecimal. (For example, ibase=A sets to base ten, regardless 
of the current ibase value.) Otherwise, the behavior is undefined 
when digits greater than or equal to the value of ibase appear in
the input.

그렇기 때문에 ibase=F설정이 입력베이스를베이스 15로 변경 한 이유는 항상베이스 10을 사용하여베이스를 설정하는 것이 좋습니다. 혼동하지 마십시오.


@ StéphaneChazelas-1989 년 정도 SysVr3 머신에서 작동하는 "ibase = A"를 기억합니다. 나는 그 단일 유닉스 사양보다 더 멀리 갔다. 나는 이전 심판을 빠르게 구글에 올릴 수 없었다.
Bruce Ediger

더 오래 전부터 구형 사양과 더 많은 링크가 있기 때문이라고 생각합니다. apache / mysql / bugzilla ...와 같은 종류의 일이 발생합니다. google에서 최신 버전 대신 이전 버전에 대한 문서를 제공합니다.
Stéphane Chazelas

5

모든 숫자는 GNU bc에서 숫자가 표시되는 명령문에 유효한 현재 입력 기준으로 해석됩니다. 현재 입력 외부의 숫자를 사용하는 경우 부분이있을 때 기본에서 사용할 수있는 가장 높은 숫자 (10 진수 9)로 해석됩니다. 여러 자릿수 또는 단일 자릿수 ( A10 진수 == 10) 로 사용되는 경우 일반 값으로 표시됩니다 .

로부터 수동 BC GNU :

한 자리 숫자는 ibase 값에 관계없이 항상 숫자 값을 갖습니다 . (예 : A = 10) 여러 자리 숫자의 경우 bc모든 입력 숫자를 ibase 보다 크거나 같은 ibase -1 값으로 변경합니다 . 이것은 숫자가 FFF항상 입력베이스의 가장 큰 3 자리 숫자가되도록합니다.

그러나 POSIX 표준은 다른 컨텍스트가 아닌 ibaseand 에 할당 할 때만이 동작을 정의합니다 obase.

bcSUS 사양에서 :

어느 경우 에 ibase있는 obase가 단일 할당 자리 에서 BC 어휘 규칙의리스트로부터 값을, 값이 16 진수로 간주되어야한다. (예를 들어, ibase와는 관계없이 현재의 기지국에 열 세트 = 에 ibase 값.)였다 이상의 자리 값과 동일한 경우에 그렇지 않은 경우, 동작이 정의되지 ibase와는 입력에서 나타난다. 모두 에 ibase 하고 있는 obase는 10의 초기 값을 가져야한다.

누락 된 핵심 요소는 F가 실제로 16이 아니라 실제로 15라는 것입니다. ibase = F를 설정하면 입력 기준을 15로 설정합니다.

따라서 알 수없는 상태에서 ibase를 16 진으로 이식 가능하게 설정하려면 다음 두 명령문을 사용해야 ibase=A; ibase=16합니다. 그러나 프로그램을 시작할 때 십진법에 의존하고 간단히 사용할 수 있습니다 ibase=16.


+1 :와 귀여운 트릭 ibase=A; ibase=16.
워렌 영


헤더의 6과 7이 항상 버전이라고 생각했습니다. 다른 것을 본 적이 없습니다. 문제 # 1-5는 무엇입니까?
Random832

@ Random832 : SUS와 POSIX 는 같은 것이 아닙니다 .
워렌 영

@WarrenYoung SUS가 POSIX를 통합하지 않습니까? 이 단락에는 확장 태그가 없으며이 문서에는 "POSIX.1-2008 볼륨의 일부"와 같은 내용이 포함되어 있습니다.
Random832

0

맨 페이지 에 따르면, 와 같은 숫자 대신 한 자리 숫자 를 설정 ibase하고 obase사용하는 것이 좋습니다 .16bc

한 자리 숫자는 ibase 값에 관계없이 항상 숫자 값을 갖습니다.

이는 A,B,...,F10,11,...,15이 무엇이든 관계없이 항상 값이 각각 있음을 의미합니다 ibase. F+1number를 지정 하는 데 사용할 수도 있습니다 16. 예를 들어, 당신은 더 나은 작성

echo "ibase=F+1; obase=A; C0" | bc

쓰는 대신 echo "ibase=16; obase=A; C0" | bc그 입력 기준을 지정하는 16출력베이스이다 10. 또는 예를 들어 둘 다 원 ibase하고 obase16 세가되면 더 잘 사용하는 것이 좋습니다

ibase=F+1; obase=F+1

를 사용하는 대신 ibase=16; obase=10. 마찬가지로 14 진수로 숫자를 입력하고 16 진수로 숫자를 출력하려면

ibase=E; obase=F+1

목욕 형태는 동일한 결과를 갖지만 전자는 오류가 덜 발생하는 반면, 후자는 더 혼동과 오류가 발생할 수 있습니다.

의 실행 환경에 bc있거나 파일에 계산을 작성한 다음 해당 파일을 bc인수로 전달할 때 두 양식의 차이점이 특히 분명해집니다 . 이러한 상황에서는, 당신은의 값을 변경해야 할 수도 ibaseobase여러 번, 그리고 후자의 양식을 사용하여 심각한 혼란과 오류가 발생할 수 있습니다. (경험)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.