프로그래밍 할 때 다른 숫자를 사용하는 이유


35

저의 동료들과 저는 왜베이스 10이 아닌베이스에서 숫자를 프로그램하는 사람이 없는지 알아 내기 위해 마음을 구부 렸습니다.

나는 당신이 작업하고있는 올바른 기초에 변수를 넣음으로써 더 긴 방정식을 최적화 할 수 있다고 제안했습니다 (예를 들어, 나머지가없는 5 세트 만 있다면 5를 사용할 수 있습니다). 그게 사실이라면.

이견있는 사람?


6
이 질문을 제기 한 구체적인 예가 있습니까? base-2 또는 base-16에있는 것은 컴퓨터가 이해하기 쉽기 때문에 분명히 이점이 있습니다.
KDiTraglia

4
"기본 프로그래밍 번호 ..."는 무엇을 의미합니까? 숫자가 있습니다. 기간. 그들은 내부적으로 몇 가지 기본 표현하고 있지만, 대부분하지 않는 문제, 변경되지 않는 모든 연산 규칙을.

12
@JMD-중재자와 협력하여 두 개의 교차 게시 중 하나를 제거하고 여기에 하나를 P.SE에 배치하십시오. 사이트 간 교차 게시는 눈살을 찌푸리게합니다. 개조는 대신 질문을 마이그레이션 할 수 있습니다.

10
@JMD-교차 게시는 여전히해야 할 일이 아닙니다. 필요한 경우 이러한 질문에 대한 마이그레이션 프로세스가 있습니다 .
Oded

2
@JMD 게시하지 마십시오. 둘 이상의 사이트에 적합한 질문은 매우 드 rare니다. 예를 들어 이번에는 귀하의 질문이 스택 오버플로에 관한 주제와 관련이 없습니다. 그러나 귀하의 질문이 두 사이트 모두에 적합하더라도 사이트를 중심으로 쇼핑하는 것은 일반적으로 싫은 일입니다. 우리는 모두 여기서 우리의 시간을 자원하고 있습니다. 교차 게시 전에 스택 오버플로에 대한 답변을 평가하기 위해 잠시 동안 기다릴 수 있습니다.
yannis

답변:


59

10 진수 이외의 코드로 숫자를 쓰는 일반적인 이유는 비트 트위들 링 때문입니다.

C에서 예제를 선택하려면 (C가 무엇이든 좋으면 비트 트위들 링에 좋기 때문에) 일부 저수준 형식은 2 비트와 6 비트 숫자를 바이트로 인코딩합니다. xx yyyyyy:

main() {
    unsigned char codevalue = 0x94; // 10 010100
    printf("x=%d, y=%d\n", (codevalue & 0xc0) >> 6, (codevalue & 0x3f));
}

생산

x=2, y=20

이러한 상황에서 16 진수로 상수를 쓰는 것은 10 진수로 쓰는 것보다 혼란스럽지 않습니다. 1 개의 16 진수는 깔끔하게 4 비트 (1 바이트 반, 1 개의 니블)에 해당하고 2에서 1 바이트 0x3f에는 해당하므로 숫자 는 모든 비트를 갖습니다. 낮은 니블에 설정되고 두 비트는 높은 니블에 설정됩니다.

두 번째 줄을 8 진수로 쓸 수도 있습니다.

printf("x=%d, y=%d\n", (codevalue & 0300) >> 6, (codevalue & 077));

여기서, 각 숫자는 3 비트의 블록에 해당한다. 어떤 사람들은 생각하기가 더 쉽다고 생각하지만 요즘에는 매우 드물다고 생각합니다.


또 다른 예는 "마법 번호"0xDEADBEEF를 사용하는 것입니다. 이 게시물을 참조하십시오 stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

다른베이스를 사용하는 주된 이유는 비트에 관심이 있기 때문입니다.

훨씬 쉽게 읽을 수 있습니다

int mask=0xFF;
byte bottom_byte = value & mask;

...보다

int mask=255;
byte bottom_byte = value & mask;

또는 더 복잡한 것을 이미지화

int mask=0xFF00FF00;
int top_bytes_by_word = value & mask;

에 비해

int mask=4278255360; //can you say magic number!? 
int top_bytes_by_word = value & mask;

16 진수는 기본적으로 좀 더 압축 된 이진 형식이기 때문에 16 진수 예제의 의도는 여기에서 매우 분명합니다 ... 대조적으로 base-10 (우리가 사용하는 것)은 거의 바이너리에 매핑되지 않습니다.

0xFF = b11111111 = 255
0xFFFF = b1111111111111111 = 65536
0xF0F0 = b1111000011110000 = 61680

일부 언어로 사용할 수있는 다른 자료도 있습니다. 바이너리, 16 진수 및 10 진수 이외의 다른베이스는 거의 사용하지 않을 것입니다. 일부 이상한 사람들은 여전히 ​​8 진법을 사용하지만 이것은 제정신 프로그램에서 볼 수있는 가장 난해한 것입니다.


2
8 진은 전혀 드물지 않고 0은 8 진입니다 :)
gerrit

2
@ 얼즈 : 손가락 이 많은 사람들 . :-)
Bryan Oakley

3
26 x 2 + 10 = 모든 대문자와 소문자 및 모든 숫자 그렇게 특이한 것은 아닙니다. 또한 대소 문자를 구분하지 않는 동일한 버전의 Base 36이 사용되는 것을 보았습니다.
Darrel Hoffman

3
@vasile : 사람들이 다른 방식이 아닌 base-60 시스템을 사용했기 때문에 1 시간에 60 분, 1 분에 60 초가 있습니다. 자연에 한 시간에 60 분이 있어야한다고 말하는 것이 믿지 않기를 바랍니다.
Joren

1
그렇습니다, 그들은 별에서 그것을 읽었고 그들은 시간 측정 때문에 base-60을 사용했습니다. 1 년에 360 일 (= 6x60)이면 base-60에서 시간을 측정하는 것은 그리 열악하지 않습니다.
ytg

8

아시다시피 컴퓨터는 바이너리를 기반으로합니다. 이것은 기본 2입니다.

이다 쉬운 기본 2, 4, 8, 16 (2 유사한 배수)을 훨씬 쉽게에 대한 이유에 대한 숫자와 함께 작업 할 수있는 소스 코드에서이 번역을 유지 사이의 변환합니다.

Assembly 및 C와 같은 저수준 언어의 경우 이는 프로세서 작업 (예 : 나누기 및 곱하기의 비트 이동)으로 직접 변환 될 수 있습니다. 즉, 이러한 숫자 기반을 사용하면 코드가 훨씬 빨라집니다.

또한 모든 연산이 숫자 연산 인 것은 아닙니다. 비트 2가 비트와 직접 바이올린을 연결해야하는 경우에는베이스 2 또는 그 중 하나를 사용하여 연산이 훨씬 쉬워집니다.

더 배우고 싶다면 Charles Petzold의 Code를 읽는 것이 좋습니다 .


3
컴파일러는 젠장하지 않습니다. 실제로 당신이 나열하는베이스간에 변환하는 것이 더 쉽지만,베이스 10에 대한 간단한 (느린) 변환은 어렵지 않으며 컴파일러 구성에 유용한 대부분의 언어 (어셈블리를 사용하지 않음)는 표준 라이브러리에서 변환 할 수 있으므로 컴파일러에서 효과적으로 무료로 사용할 수 있습니다.

1
C에서 16 진수를 사용한다고해서 더 빠른 프로그램으로 변환되지는 않습니다. 컴파일러는 어떤베이스를 사용하든 상관 없습니다.
Charles Salvia

5
프로그램이 작성된베이스에 관계없이 컴파일러는 컴파일 타임에 프로그램을 바이너리로 변환합니다. 조립 지침은 동일합니다.
Karl Bielefeldt

2
기업의 컴퓨터는 트라이 enery의 부울을 기반으로 사실이다 : 참, 거짓과 "파일을 찾을 수 없습니다"
마틴 베켓


4

고도로 전문화 된 프로그램 외에는 10, 16 또는 2 이외의베이스를 사용하는 것은 매우 드 rare니다.

기본 16 (16 진수)은 바이트 (0-255)의 전체 범위를 두 자리 (0x00-0xFF)로 표현할 수있어 원시 16 진 덤프 또는 이진 데이터 작업을 훨씬 쉽게 수행 할 수 있기 때문에 유용합니다. 16 진법은 비트 연산자와 함께 비트 마스크를 사용할 때 유용합니다. 두 자릿수의 바이트 대응은 가독성에 도움이되기 때문입니다.

좀처럼 드문 경우지만, 기본 2 (이진)를 비트 단위 연산과 함께 사용할 수도 있지만 많은 프로그래밍 언어는 기본 2 리터럴을 지원하지 않으며 16 진법이 훨씬 간결하고 읽기 쉽습니다.

UNIX 파일 권한으로 인해 Base-8 (8 진)도 사용됩니다. 그 외에는 고도로 전문화 된 수학적 상황 이외의 10이 아닌 다른 염기를 사용하는 것은 매우 드 rare니다.


8 진은 종종 문자 값을 지정하고 때때로 2 진 데이터를 덤프하는 데 사용됩니다.
Caleb

3

다른 기본을 사용하는 가장 일반적인 유효한 이유는 기본 2 로의 변환이 쉬워야합니다. 8 또는 16의 짧은 테이블을 암기하여 계산기를 사용하지 않고 기본 8 또는 16을 16 진수로 이진수로 변환하는 것은 쉽지 않습니다. 번호:

 0000 0     0001 1     0010 2     0011 3
 0100 4     0101 5     0110 6     0111 7

 1000 8     1001 9     1010 A     1011 B
 1100 C     1101 D     1110 E     1111 F

이것은 여러 가능성을 열어줍니다 :

  • 숫자가 의미있는 이진수의 구성을 나타내는 경우 컴퓨터없이 개별 구성 요소를 결정할 수 있습니다. 24 비트 번호는 RGB의 색을 나타내는 경우 예를 들어, 그 말할 사소한 0xFF00FF이다 마젠타 (빨강 + 파랑); 당신이 제시 할 때 작업이 훨씬 어렵다16711935
  • 숫자가 비트 마스크를 나타내는 경우 훨씬 긴 이진수보다 작은 16 진수로 기록하는 것이 더 실용적입니다.
  • 8 진수로 인쇄 할 때 이진 코드를 쉽게 읽을 수 있도록 특정 아키텍처가 중단되었습니다. PDP-11은 그러한 시스템 중 하나였습니다. 가장 중요한 비트는 16 비트 조작에서 8 비트 조작을 알려줍니다. 마지막 두 개의 8 진 그룹을 사용하면 작업에 관련된 두 레지스터를 알 수 있습니다. 디스어셈블러없이 화면에서 PDP-11 바이너리 코드를 읽을 수있는 여러 사람들을 알고 있었지만 8 진수 시스템으로 인쇄하려면 머신 코드가 필요했습니다.

2

컴퓨터 (또는 더 정확하게는 컴파일러)는 소스 코드에서 사용하는 숫자를 전혀 신경 쓰지 않습니다. 가장 일반적으로 사용되는 프로그래밍 언어는 기수 8 (8 진수), 10 (10 진수) 및 16 (16 진수)을 직접 지원합니다. 일부는 또한 2 진수 (2 진) 숫자를 직접 지원합니다. 특수 언어는 다른 숫자 기반도 지원할 수 있습니다. ( "직접 지원"함으로써 소스 코드 자체에서 비트 시프 팅, 곱셈, 나눗셈 등과 같은 수학적 트릭에 의존하지 않고 해당베이스에 숫자를 입력 할 수 있음을 의미합니다.0x숫자 접 두부 및 일반 16 진 숫자 세트 0123456789ABCDEF. 이제 그러한 트릭은 문맥 상 숫자를 이해하기 쉽게 만드는 데 유용 할 수 있지만, 숫자 없이도 같은 숫자를 표현할 수 있다면 편리 할뿐입니다.)

그러나 결국 그것은 중요하지 않습니다. 다음과 같은 진술이 있다고 가정 해 봅시다.

int n = 10;

의도는 정수 변수를 작성하고 10 진수 10으로 초기화하는 것입니다. 컴퓨터는 무엇을 볼 수 있습니까?

i  n  t     n     =     1  0  ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)

컴파일러는이를 토큰 화 int하고 name을 사용하여 유형의 변수를 선언하고 n초기 값을 할당 함을 인식합니다. 그러나 그 가치는 무엇입니까?

바이트 순서와 정렬 문제를 무시하고 컴퓨터에 변수의 초기 값 입력은 0x31 0x30입니다. 이것은 초기 값이 0x3130 (10의 12592)이라는 것을 의미합니까? 당연히 아니지. 언어 파서는 사용 된 문자 인코딩으로 파일을 계속 읽으므로 1 0명령문 종결자가 읽습니다 . 이 언어베이스 (10)가 가정되기 때문에, 이것은 "0 1, 10, 끝"으로 읽힌다 (뒤로). 즉, 10 진수 값입니다.

16 진수로 값 0x을 지정 하고 언어 에서 다음 값이 16 진수임을 지정하는 데 사용 하면 다음과 같은 결과가 나타납니다.

i  n  t     n     =     0  x  1  0  ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)

컴파일러는 0x(0x30 0x78)을 보고 이를 기본 -16 접두사로 인식하므로 그 뒤에 유효한 기본 16 번호를 찾습니다. 명령문 종결자가 나올 때까지 읽습니다 10. 이것은 0 "1s", 1 "sixteens"로 번역되어 10 진법에서 16으로, 또는 2 진법에서 00010000으로 표현됩니다.

두 경우 모두 단순성을 위해 최적화를 무시하고 컴파일러는 int유형 변수 의 값을 보유 할 수있는 충분한 스토리지를 할당 하고 소스 코드에서 읽은 값을 일종의 임시 보유 변수에 배치합니다. 그런 다음 (아마도 나중에) 결과 바이너리 값을 객체 코드 파일에 씁니다.

보시다시피, 소스 코드에 숫자 값을 쓰는 방식은 완전히 중요하지 않습니다. 그것은 아주 약간의 컴파일 시간에 영향을,하지만 난 회전 디스크의 플래터 디스크 액세스 시간, 데이터 버스 충돌 주위 임의 난류 같은 것들 (예 : 운영 체제에서 디스크 캐싱과 같은 최적화를 무시하고, 다시) 상상 것 등이 훨씬 더 큰 영향을 미칩니다.

결론 : 걱정하지 마십시오. 선택한 프로그래밍 언어가 지원하고 숫자를 사용 및 / 또는 읽는 방법에 적합한 기반으로 숫자를 작성하십시오. 소스 코드에서 사용할 숫자 기반을 영리하게하여 컴파일 시간에 복구하는 것보다이 답변을 읽는 데 훨씬 많은 시간을 소비했습니다. ;)


1

왜베이스 10이 아닌베이스에서 숫자를 프로그래밍하기 위해 길을 떠났을까요?

아직 나타나지 않은 몇 가지 이유는 다음과 같습니다.

x00-일부 OS 및 하드웨어 장치의 API는 인수가 16 진 / 이진일 것으로 예상합니다. 이러한 API를 코딩 할 때는 다른 기준간에 변환하는 대신 API가 예상하는 것과 동일한 형식으로 숫자를 사용하는 것이 더 쉽습니다. 예를 들어, 메시지 바이트의 끝을 서버로 보내거나 통신 채널에 대한 연결을 닫으려면 메시지를 보내십시오.

x01-응용 프로그램이 저작권 표시 (\ u00a9)와 같은 특정 키보드에서 사용할 수없는 문자를 나타내도록 할 수 있습니다.

x02-소스 코드 / 파일이 다른 로컬 설정을 가진 개발자들 사이에서 이동할 때 다른 문화 설정에서 상수 / 리터럴을 시각적으로 유지하기

x03-코드를 혼란스럽고 복잡하게 보이게하려면 C #이 8 진 상수를 지원하지 않는다는 것이 좋습니다.


1

중요한 문제는 적절한 크기의 단일 컴퓨터 크기 단어를 나타내는 것입니다. 6502는 8 비트 프로세서였습니다. 4004는 4 비트 프로세서였습니다.

4 또는 8 비트 숫자를 다룰 때 잘 작동합니다. 4 비트 숫자는 단일 16 진수 문자입니다. 8 비트 숫자 (바이트)는 2 개의 16 진수입니다. 현재 2 비트 워드의 전력을 갖는 시스템은 16 비트, 32 비트, 64 비트와 같이 일반적으로 사용되는 표준입니다. 이 모든 것은 16 진수로 표현하기 위해 4로 나눕니다.

8 진수 (기본 8)는 단어 크기가 12, 24 또는 36 인 시스템에서 사용되었습니다. PDP8, IBM Mainframe 및 ICL 1900 일이 사용되었습니다. 이 단어는 제한된 16 진수 범위가 아닌 8 진수를 사용하여보다 쉽게 ​​표현되었습니다 (예, 4로도 나눕니다).

기본 8 번호 매기기를 사용하면 비용도 절감됩니다. BCD에서 12 비트를 나타내면 첫 번째 숫자는 0-4 일 수 있지만 두 번째, 세 번째 및 네 번째는 0-9 일 수 있습니다. 이 작업이 16 진으로 수행 된 경우 3 개의 16 진 문자가 있지만 각각 16 개의 가능한 값이 있습니다. 0-9 (BCD의 경우 추가 로직 사용) 또는 16 진수의 경우 0-F 인 것보다 0-7 만 있는 닉시 튜브 를 만드는 것이 더 저렴했습니다 .

여전히 소유자, 그룹 및 월드가 각각 권한을 나타내는 3 비트를 갖는 유닉스 파일 권한 (755, 644)으로 8 진수를 보았습니다.


수학 세계에서는 때때로 다른 기초를 가진 이상한 일을합니다. 예를 들어, 프로젝트 오일러 396 의 약한 Goodstein 시퀀스 또는 회문 번호가 있는 간단한 것 . 베이스에 다수의 특성이있다 N 의 배수 수 있다는 1 - N은 그 자리의 배수로 합계 것이다 1 - N은 . 또한 N-1 이 완전한 제곱이면 sqrt ( N-1 ) 에도이 속성이 존재합니다 . 이것은 특정 수학 문제에 일부 응용 프로그램이 있습니다.


1
8 진수는 PDP에 9/18 비트 바이트가 있었기 때문에 8 진수는 3 비트를 나타내므로 바이트를 3으로 나눌 수 있다면 많은 의미가 있습니다
Martin Beckett

1
8 비트는 일부 16 비트 시스템 (대부분 PDP-11)에서도 사용되었습니다 . 부호 비트를 제외한 비트 수는 15 로 3으로 나뉘어 졌기 때문에 원래 UNIX 운영 체제 (예 : "od"는 이진 파일을 덤프하는 표준 도구이며 기본 형식은 사용 권한이 아니라 8 비트 16 진수가 아니라 16 비트 8 진수입니다. PDP-11 명령 세트에 2 개의 6 비트 피연산자 필드가있는 것도 관련이있을 수 있습니다.
Random832

Octal은 당시 기술에 표시 될 수 있기 때문에 사용되었습니다. 넥시 튜브? 아니면 다른 0-9 디스플레이? AF 디스플레이가 표시되는 데 시간이 걸렸습니다.
Jeremy J Starcher

1

금융 산업에는 효과적으로 기초 가되는 식별자 체계 가있다 ( 36) . 숫자 0-9와 문자 BZ를 사용하여 값이 0-35 인 숫자를 나타냅니다. 모호한 이름이 생성되지 않도록 모음을 건너 뜁니다.

그러나 완벽하지는 않습니다. 불행한 회사 하나가 ID를 가지고 있었던 때가 있었다 B000BZ.


1

이유 # 1 : 회로 레벨의 모든 숫자가 기본 -2 (전기 스위치가 켜져 있거나 꺼져 있음)로 표시되기 때문입니다. 이유 # 2 : 실제 회로보다 높은 레벨에서 비트가 바이트로 그룹화되고 바이트는 가능한 모든 값을 나타내는 데 10 진수 3 자리 (및 일부 유효성 검사)가 필요한 경우 2 개의 16 진수로 쉽게 표현할 수 있습니다. 바이트.

따라서 이러한 수준에서 작업하거나 일부 관리되는 환경에서 비슷한 수준으로 작업하는 경우 10 진수보다 2 진 또는 16 진으로 작업하기가 더 쉽습니다. 이를 수행하는 상황은 다양하지만 일반적으로 기본 산술 만 필요한 상황은 아닙니다.


1

기본 16 (16 진수) 숫자가 매우 자주 사용되는 영역 중 하나는 특히 웹에 HTML / CSS를 사용할 때 색상을 지정하는 것입니다. 디지털 디스플레이에서 사용하는 색상은 3 개의 "기본"색상 (RGB-빨강, 녹색, 파랑)에 대해 3 가지 강도 값의 조합을 사용하여 지정됩니다. ).

예를 들어, 진수 전체 강도 녹색 것 0x00ff0065280소수입니다. 이제 "수동으로"동일한 부분이 빨간색과 파란색이 당신의 머리에서 색상을 혼합하려고 상상이 단순히 기록 될 것 진수에서 :) 멋진 보라색 만들 절반 강도로 말할 0x800080이의 진수 값이 될 것 동안을 8388736. 회색 음영으로 작업 할 때 훨씬 쉬워집니다-50 % 회색은 0x808080(16 진수) 및 8421504(10 진수), 75 %는 0xC0C0C012632256등입니다.

16 진수를 사용하는 것이 훨씬 직관적이며이 색상 사용에 익숙한 사람은 16 진수 값만보고 즉시 색상을 "추측"할 수 있습니다. 또한 동일한 색상을 여러 번 사용해야하는 경우 (대부분의 경우) 오류가 훨씬 적습니다.

16 진수 사용량이 많은 웹 페이지 (특히 CSS)를 확인하십시오.

참고 : CSS에서 16 진수 값은 #접두사를 사용하여 작성됩니다 ( 예 : #00ff00녹색). 때로는 #0f0녹색 과 같이 3 자리로 단축되기도 합니다.


0

일부 알고리즘의 경우 기본 2가 다른 것보다 더 의미가 있습니다. 예를 들어, 이진 트리 또는 10 진 트리를 순회하는 함수를 작성 하시겠습니까?

그러나 컴퓨터가 거의 보편적으로 숫자를 나타내는 방식이기 때문에 base 2가 더 자주 사용됩니다. 이것은 다음을 의미합니다.

  • 기본 2에서는 많은 작업이 더 효율적입니다.
    • 2의 곱셈, 나눗셈 및 모듈로 거듭 제곱은 일반 나눗셈보다 훨씬 빠릅니다.
    • 플래그와 작은 값은 큰 숫자의 이진수로 더 효율적으로 저장, 검색 및 조작 할 수 있습니다.
  • 데이터 파일 및 네트워크 데이터 스트림을 읽고 쓰고 조작하는 작업은 이진 숫자로 표시된다는 사실을 직접 처리해야합니다.

또한, 본질적으로 2 또는 10이 아닌 홀수 기반을 필요로하는 드문 응용 프로그램이 있습니다.


2
물론 나는 10ary tree를 사용할 것이다. 이 이상한 2캐릭터가 뭐에요 ?
코드 InChaos

0

어떤 이유로 든 polydactyly를 가지고 있고 11 개의 손가락을 가지고 있거나 발가락으로 세는 것을 좋아하므로 20 번 기지에서 일하는 것이 정직합니다. 그러나 유니버설 주제에서 매일 비트와 바이트를 처리 해야하는 대부분의 사람들은 기본 19에서 비트 조작을 수행하는 무언가를 얻는다면 실제로 똑딱 거리게됩니다.

베이스 x에 대한 이유

Base 10-우리가 10 개의 계산 숫자를 가지고 있기 때문에 모든 물건의 모델입니다 (발은 이상하고 냄새가 나므로 사용하지 않습니다).

Base 2-컴퓨터는 이것을 비트 (온 / 오프)에 사용합니다. 이것은 게이트 / 트랜지스터 / 커패시터에 의해 전파되는 읽기 가능한 전압 레벨과 관련이 있습니다.

Base 8-Old, 컴퓨터가 거대하지 않았을 때 (또는 공간이 좋았을 때), 이것은 무언가 또는 다른 것에 좋았습니다 (1 비트를 좋아하지 않습니다)

Base 16-비트 조작을 위해 바이트의 상위 및 하위 니블을 표시하는 데 적합합니다. 이것은 임베디드 / fpga / 하드웨어 세계에서 매우 유용합니다.

컴퓨터의 표준 기반

선호도에 따라, 나에게 주어진 16 진수 RGB 값에 색상이 얼마나 "켜져 있는지"정확하게 말할 수 있습니다. 결과적으로 하드웨어에서 단일 int로 표현 될 수 있으며 약간의 변화가 나에게 다시 주어질 수 있습니다 손쉬운, 1 개의 복잡한 색상 = 1 개의 데이터 포인트로 제한된 메모리로 큰 이미지 처리에 적합합니다. 이것을 기본 10 표현과 비교하면 모두 추가하고 숫자로 저장할 수 있지만 R은 시간 10000, G는 100, B는 자체 공간이므로 많은 수학 연산입니다. , 일반적으로 곱셈은 교대보다 더 많은 사이클 비용이 들기 때문에 마지막 데이터가 처리되기 전에 다음 데이터 조각이 이미 대기열에 있습니다.

때때로베이스 2, 8 또는 16에서 작업하는 것이 더 낫습니다. 대부분의 컴퓨터에서 2를 곱한 것은 약간의 이동이며, 매우 빠르며 2로 나누는 것과 같습니다.

비트 twiddling의 아이디어에 대해 더 설명합니다. 임베디드 환경에서 작업 할 때 여러 조명, 스위치 또는 다른 레지스터 매핑 항목에 액세스해야하는 경우가 많습니다.

이 경우 각 스위치에 전체 char, byte 또는 int를 할당하는 것은 비효율적이며 어리석은 일입니다. 스위치 또는 표시등에는 2 개의 위치가 있습니다-켜기 및 끄기-최대 256 위치 또는 2 ^ 16 배열의 각 표시등은 단일 워드 / 레지스터에서 8 또는 16 또는 32 또는 64 또는 128 (데이터 유형의 너비)에 맞는 1 비트 일 수 있습니다. 공간 효율성이 필요하며 오히려 환영합니다.

RGB 데이터 처리, GPS, 오디오, ASCII 등의 많은 신호 데이터와 같은 프로그래밍에 기본 2 ^ n을 사용하는 것은 16 진수, 2 진수 및 8 진수로 훨씬 간단합니다. 그것이 기계에서 표현되는 방식이기 때문입니다. 제시되는 내용과 조작 방법을보다 쉽게 ​​식별 할 수 있습니다.

변이베이스 사용

코드를 작성하지 않으면 효율성이 없습니다. 기본 11을 원한다면 데이터 유형을 설정하고 연산자를 오버로드하여 사용자에게 표현을 처리해야합니다. 시스템이 5 개의 항목을 보유하고 5 개의 항목을 여러 번 보유하는 시스템이 5 개의 항목 수학으로 변환되어야하는 이유는 없습니다. 또한 모든 항목이 271의 배수이기 때문에 기본 271에 대한 코드를 작성하기로 결정한 사람이 문서를 잘 작성했거나 기본 271을 작성하는 데 필요한 것보다 코드를 이해하는 데 더 많은 시간을 할애 할 수 있기를기도하는 것이 좋습니다.



0

다른 답변이 대체 기반 컴퓨팅에서 두 가지 일반적인 용도를 언급하지 않은 것에 놀랐습니다.

  1. 인코딩 : 예를 들어 Base64 인코딩은 매우 일반적입니다. 인코딩은 단순히 일련의 바이트를 큰 이진 (base-2) 숫자로 해석하고 해당 숫자를 ASCII 숫자로 표시되는 Base64 숫자로 변환합니다.
  2. 압축 : 표현을 줄이려면 이진수, 10 진수 또는 16 진수를 더 큰 밑수로 나타내는 것이 종종 바람직합니다. 예를 들어 bit.ly와 같은 모든 비트 단축기가이 작업을 수행합니다. 또는 URL에서 사용하기 위해 GUID를 줄 이도록 할 수도 있습니다.

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.