2012-09-09 2 views
1

나는 숙제로 C++의 임의의 정수 라이브러리를 작성하고 있습니다. 10 진수^n에서 부호없는 int의 벡터로 내부적으로 표현했습니다. 여기서 n은 가능한 한 큰 값이고 단일 서명되지 않은 int 숫자에 맞습니다.인접하지 않은 내부 번호 표현에서의 비트 시프트

필자는이 선택을 공간, 성능 및 디지트 액세스 간의 트레이드 오프로 설정했습니다 (사람이 읽을 수있는 문자열로 변환 할 때 복잡성을 추가하지 않고 10 진수를 사용하는 것보다 훨씬 좋은 성능을 얻을 수 있음). 그래서 예를 들면

:

base1000000000은 (441243123,294967295) 2 자리 (콤마 구분)

유효한 시간 (441,243,123,294,967,295) 18 자리

UINT32

[00,011,010 01,001,100 11,010,101와

내부 표현 11110011] [00010001 10010100 11010111 11111111]

과제를 완료하려면 구현해야합니다. 멘 트 비트 시프 팅 및 기타 비트 연산자. 내부 표현이있는 숫자의 경우 shift를 구현하는 것이 합리적입니까?

내부 표현의 모든 비트가 의미가 있도록 기본 2^n으로 변경해야합니까?

답변

2

당신 수 있지만 필요가 없습니다 : 내부적으로 이러한 int의 여전히으로 바이너리로 해석되기 때문에 비트 이동은 상관없이 나중에 그것을 해석에 사용하는 것을 기본, 수를 두 배로 것 기본 교대 조작. 귀하의 구현은 거기에서의 절충안을 결정해야합니다. 이행이 더 어려워 질 것이기 때문입니다. 반면에, base-10의 인쇄는 더 간단하게 유지됩니다.

고려해 볼 수있는 십진법 시스템을 선호하는 또 다른 솔루션은 binary-coded decimals (BCD)입니다. 이전에는 이러한 작업을 가속화하는 데 사용 된 하드웨어 (예 : 6502, Apple-2의 CPU)에는 BCD 해석에서 바이트를 추가하기위한 특수 지침이 포함되었습니다. 이 표현을 사용하는 경우 특별한 수정을해야하지만 가치있는 학습이 될 수 있습니다.

2

내부 표현의 모든 비트가 중요한 값이되도록베이스 2^n으로 변경해야합니까?

가장 확실하게 예!

뿐만 아니라 현대 컴퓨터는 일반적으로 모두 base2에 관한 것입니다. 이것이 운동이라면, 그것을 잘하는 법을 배우기를 원할 것입니다.

1

이러한 종류의 모든 라이브러리는 기본 2를 사용합니다. 이유는 다음과 같습니다. 빠른 처리, 비트 연산 가능성,보다 컴팩트 한 저장 등입니다. 이러한 장점은 십진법으로 변환하는 것이 어려워집니다. 따라서 바이너리로 변환하는 것이 좋습니다.