저의 동료들과 저는 왜베이스 10이 아닌베이스에서 숫자를 프로그램하는 사람이 없는지 알아 내기 위해 마음을 구부 렸습니다.
나는 당신이 작업하고있는 올바른 기초에 변수를 넣음으로써 더 긴 방정식을 최적화 할 수 있다고 제안했습니다 (예를 들어, 나머지가없는 5 세트 만 있다면 5를 사용할 수 있습니다). 그게 사실이라면.
이견있는 사람?
저의 동료들과 저는 왜베이스 10이 아닌베이스에서 숫자를 프로그램하는 사람이 없는지 알아 내기 위해 마음을 구부 렸습니다.
나는 당신이 작업하고있는 올바른 기초에 변수를 넣음으로써 더 긴 방정식을 최적화 할 수 있다고 제안했습니다 (예를 들어, 나머지가없는 5 세트 만 있다면 5를 사용할 수 있습니다). 그게 사실이라면.
이견있는 사람?
답변:
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 비트의 블록에 해당한다. 어떤 사람들은 생각하기가 더 쉽다고 생각하지만 요즘에는 매우 드물다고 생각합니다.
다른베이스를 사용하는 주된 이유는 비트에 관심이 있기 때문입니다.
훨씬 쉽게 읽을 수 있습니다
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입니다.
이다 쉬운 기본 2, 4, 8, 16 (2 유사한 배수)을 훨씬 쉽게에 대한 이유에 대한 숫자와 함께 작업 할 수있는 소스 코드에서이 번역을 유지 사이의 변환합니다.
Assembly 및 C와 같은 저수준 언어의 경우 이는 프로세서 작업 (예 : 나누기 및 곱하기의 비트 이동)으로 직접 변환 될 수 있습니다. 즉, 이러한 숫자 기반을 사용하면 코드가 훨씬 빨라집니다.
또한 모든 연산이 숫자 연산 인 것은 아닙니다. 비트 2가 비트와 직접 바이올린을 연결해야하는 경우에는베이스 2 또는 그 중 하나를 사용하여 연산이 훨씬 쉬워집니다.
더 배우고 싶다면 Charles Petzold의 Code를 읽는 것이 좋습니다 .
아마도 당신이 base 12 시스템 을 사용하는 고대 문명의 경제를 시뮬레이션하는 게임을 작성하고 있다면 .
고도로 전문화 된 프로그램 외에는 10, 16 또는 2 이외의베이스를 사용하는 것은 매우 드 rare니다.
기본 16 (16 진수)은 바이트 (0-255)의 전체 범위를 두 자리 (0x00-0xFF)로 표현할 수있어 원시 16 진 덤프 또는 이진 데이터 작업을 훨씬 쉽게 수행 할 수 있기 때문에 유용합니다. 16 진법은 비트 연산자와 함께 비트 마스크를 사용할 때 유용합니다. 두 자릿수의 바이트 대응은 가독성에 도움이되기 때문입니다.
좀처럼 드문 경우지만, 기본 2 (이진)를 비트 단위 연산과 함께 사용할 수도 있지만 많은 프로그래밍 언어는 기본 2 리터럴을 지원하지 않으며 16 진법이 훨씬 간결하고 읽기 쉽습니다.
UNIX 파일 권한으로 인해 Base-8 (8 진)도 사용됩니다. 그 외에는 고도로 전문화 된 수학적 상황 이외의 10이 아닌 다른 염기를 사용하는 것은 매우 드 rare니다.
다른 기본을 사용하는 가장 일반적인 유효한 이유는 기본 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
이것은 여러 가능성을 열어줍니다 :
0xFF00FF
이다 마젠타 (빨강 + 파랑); 당신이 제시 할 때 작업이 훨씬 어렵다16711935
컴퓨터 (또는 더 정확하게는 컴파일러)는 소스 코드에서 사용하는 숫자를 전혀 신경 쓰지 않습니다. 가장 일반적으로 사용되는 프로그래밍 언어는 기수 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
유형 변수 의 값을 보유 할 수있는 충분한 스토리지를 할당 하고 소스 코드에서 읽은 값을 일종의 임시 보유 변수에 배치합니다. 그런 다음 (아마도 나중에) 결과 바이너리 값을 객체 코드 파일에 씁니다.
보시다시피, 소스 코드에 숫자 값을 쓰는 방식은 완전히 중요하지 않습니다. 그것은 수 이 아주 약간의 컴파일 시간에 영향을,하지만 난 회전 디스크의 플래터 디스크 액세스 시간, 데이터 버스 충돌 주위 임의 난류 같은 것들 (예 : 운영 체제에서 디스크 캐싱과 같은 최적화를 무시하고, 다시) 상상 것 등이 훨씬 더 큰 영향을 미칩니다.
결론 : 걱정하지 마십시오. 선택한 프로그래밍 언어가 지원하고 숫자를 사용 및 / 또는 읽는 방법에 적합한 기반으로 숫자를 작성하십시오. 소스 코드에서 사용할 숫자 기반을 영리하게하여 컴파일 시간에 복구하는 것보다이 답변을 읽는 데 훨씬 많은 시간을 소비했습니다. ;)
왜베이스 10이 아닌베이스에서 숫자를 프로그래밍하기 위해 길을 떠났을까요?
아직 나타나지 않은 몇 가지 이유는 다음과 같습니다.
x00-일부 OS 및 하드웨어 장치의 API는 인수가 16 진 / 이진일 것으로 예상합니다. 이러한 API를 코딩 할 때는 다른 기준간에 변환하는 대신 API가 예상하는 것과 동일한 형식으로 숫자를 사용하는 것이 더 쉽습니다. 예를 들어, 메시지 바이트의 끝을 서버로 보내거나 통신 채널에 대한 연결을 닫으려면 메시지를 보내십시오.
x01-응용 프로그램이 저작권 표시 (\ u00a9)와 같은 특정 키보드에서 사용할 수없는 문자를 나타내도록 할 수 있습니다.
x02-소스 코드 / 파일이 다른 로컬 설정을 가진 개발자들 사이에서 이동할 때 다른 문화 설정에서 상수 / 리터럴을 시각적으로 유지하기
x03-코드를 혼란스럽고 복잡하게 보이게하려면 C #이 8 진 상수를 지원하지 않는다는 것이 좋습니다.
중요한 문제는 적절한 크기의 단일 컴퓨터 크기 단어를 나타내는 것입니다. 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 : 회로 레벨의 모든 숫자가 기본 -2 (전기 스위치가 켜져 있거나 꺼져 있음)로 표시되기 때문입니다. 이유 # 2 : 실제 회로보다 높은 레벨에서 비트가 바이트로 그룹화되고 바이트는 가능한 모든 값을 나타내는 데 10 진수 3 자리 (및 일부 유효성 검사)가 필요한 경우 2 개의 16 진수로 쉽게 표현할 수 있습니다. 바이트.
따라서 이러한 수준에서 작업하거나 일부 관리되는 환경에서 비슷한 수준으로 작업하는 경우 10 진수보다 2 진 또는 16 진으로 작업하기가 더 쉽습니다. 이를 수행하는 상황은 다양하지만 일반적으로 기본 산술 만 필요한 상황은 아닙니다.
기본 16 (16 진수) 숫자가 매우 자주 사용되는 영역 중 하나는 특히 웹에 HTML / CSS를 사용할 때 색상을 지정하는 것입니다. 디지털 디스플레이에서 사용하는 색상은 3 개의 "기본"색상 (RGB-빨강, 녹색, 파랑)에 대해 3 가지 강도 값의 조합을 사용하여 지정됩니다. ).
예를 들어, 진수 전체 강도 녹색 것 0x00ff00
와 65280
소수입니다. 이제 "수동으로"동일한 부분이 빨간색과 파란색이 당신의 머리에서 색상을 혼합하려고 상상이 단순히 기록 될 것 진수에서 :) 멋진 보라색 만들 절반 강도로 말할 0x800080
이의 진수 값이 될 것 동안을 8388736
. 회색 음영으로 작업 할 때 훨씬 쉬워집니다-50 % 회색은 0x808080
(16 진수) 및 8421504
(10 진수), 75 %는 0xC0C0C0
및 12632256
등입니다.
16 진수를 사용하는 것이 훨씬 직관적이며이 색상 사용에 익숙한 사람은 16 진수 값만보고 즉시 색상을 "추측"할 수 있습니다. 또한 동일한 색상을 여러 번 사용해야하는 경우 (대부분의 경우) 오류가 훨씬 적습니다.
16 진수 사용량이 많은 웹 페이지 (특히 CSS)를 확인하십시오.
참고 : CSS에서 16 진수 값은 #
접두사를 사용하여 작성됩니다 ( 예 : #00ff00
녹색). 때로는 #0f0
녹색 과 같이 3 자리로 단축되기도 합니다.
일부 알고리즘의 경우 기본 2가 다른 것보다 더 의미가 있습니다. 예를 들어, 이진 트리 또는 10 진 트리를 순회하는 함수를 작성 하시겠습니까?
그러나 컴퓨터가 거의 보편적으로 숫자를 나타내는 방식이기 때문에 base 2가 더 자주 사용됩니다. 이것은 다음을 의미합니다.
또한, 본질적으로 2 또는 10이 아닌 홀수 기반을 필요로하는 드문 응용 프로그램이 있습니다.
2
캐릭터가 뭐에요 ?
어떤 이유로 든 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-9를 표시 할 수있는 많은 디스플레이가 있었지만 아직 AF는 없었습니다.
http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpg 는 그러한 예 중 하나입니다 ...
8 진법은이 디스플레이에 잘 맞으며 2 진법 또는 10 진법보다 쉬웠습니다.
다른 답변이 대체 기반 컴퓨팅에서 두 가지 일반적인 용도를 언급하지 않은 것에 놀랐습니다.
압축 : 표현을 줄이려면 이진수, 10 진수 또는 16 진수를 더 큰 밑수로 나타내는 것이 종종 바람직합니다. 예를 들어 bit.ly와 같은 모든 비트 단축기가이 작업을 수행합니다. 또는 URL에서 사용하기 위해 GUID를 줄 이도록 할 수도 있습니다.
- 821F6321-881B-4492-8F84-942186DF059B (base-16 guid)
becomes
- RRIDHW463YD8YXX7MIDI (base-36)
- 3UFmaWDjj9lifYyuT0 (base-62)