2010-03-23 2 views
3

나는 진짜 질문이 base2/binary를 base10으로 변환하는 방법이라고 가정한다. 이것의 가장 보편적 인 응용은 아마도 출력을위한 문자열을 생성하는 것일 것입니다. 즉, 2 진 수치 데이터 청크를 문자 배열로 바꾸는 것입니다. 이것이 정확히 어떻게 이루어 졌습니까?정수는 어떻게 후드에서 문자열로 변환됩니까?

내 생각 : 아마 각 수치에 대해 미리 정의 된 문자열이 아니므로 보는 , 나는 컴퓨터가 오른쪽에서 왼쪽으로 정수의 각 비트를 통과 같은데요, 때마다 적절한 값을 증가 char 배열/base10 표기법 장소. 숫자 160을 이진수 (10100000)로 취하면 8 위의 1은 128을 의미하므로 1을 세 번째 열에, 두 번째를 두 번째에, 그리고 8을 세 번째 열에 넣습니다. 6 번째 열의 1은 32를 의미하며, 두 번째 및 첫 번째 값에 해당 값을 더하여 필요에 따라 이월합니다. 이 후에는 실제 char 코드로 쉽게 변환됩니다.

+0

이 질문은 정수가 아니라 부동 소수점 수위 인 경우 더 흥미로울 것입니다. – shoosh

답변

2
while number != 0: 
    nextdigit = number % 10 
    AddToLeft(result, convert nextdigit to char) 
    number = number/10 

독자가 0과 음수를 처리하는 연습 문제로 남았습니다.

-1

우선 플랫폼 및 언어를 기반으로하기 때문에 분명히 까다로운 문제입니다.

예를 들어 Java를 사용하십시오. int로 선언 된 정수는 실제로 32 비트입니다.

정도로 == 우리

1000000000000000000000000000000 < 있어야 0의 십진 값을 나타내는 선도 1 (0 중?)이 양수인지 아닌지 나타낸다. ... 자바 저장 INT 값으로 반 부정 반 양이

그래서, 내 생각 엔 자바는 다음 할 것입니다

때문에

음이입니다

1 단계 : 덩어리에서 콘텐츠를 32 비트 메모리는 변수 "포인터"또는 리터럴

2 단계로 지적 : 진수 값을 계산 큰 숫자로 변환되도록 0

STEP3 : (JDK5의 +는)에 Int32.toString()를 사용하여 문자열 리터럴을 "0"으로 반환하십시오.

이것은 이런 질문을 한 번도 생각해 본 것이 잘못되었을 수 있습니다.

정말 어떤 언어, 문자의 배열로 값을 변환하려고 즉 추가하는 많은 오버 헤드가 발생합니다 생각하지 않는다

...

OR, 이진 값 내 수학을 기반으로, 진수로 변환하는 경험에 비추어 볼 때 문자 그대로의 재연성이 아닌 값을 기반으로 계산하게됩니다.

1 1 0 1 in binary 

    1*2^3 + 1* 2^2 + 0*2^1 +1*2^0 = 13 in decimal  
1

완료 방법은 플랫폼에 따라 다릅니다. 예를 들어 Intel 형식 프로세서는 BCD (Binary Coded Decimal) 연산을 지원합니다. 소수점

의이 레지스터 al는 00101010 바이너리 포함한다고 가정 해 봅시다

는 42

fushf ;store flags on the stack 
std ;set decimal flag 
sub bl, bl ;clear bl register 
add bl, al ;add al to bl using BCD arithmetics 
pop ;restore flags from stack 

bl 지금 등록 01000010가 포함되어 있습니다.

상위 4 비트는 0100 포함 또는 소수 제
4 개의 하위 비트는 문자로이를 변환하려면 0010 또는 소수 2.

를 포함하는 레지스터에서 4 개 개의 비트 값을 추출하고 (48)를 추가 숫자의 문자 코드를 가져옵니다.

+0

정말. 허. AFAICT, 리눅스도 uclibc도'printf'를 이용하지 않습니다. 물론 이식 가능하지는 않지만 모든 종류의 아키텍처에 맞는 코드를 가지고 있습니다. 기본 int10 문자열을 최적화 할 수있는 핫 스폿으로 충분하지 않습니다 나타내는 것 같아요. – keturn

+0

@keturn : 예, 부서가 너무 싸게 된 지금은 더 이상 사용하지 않습니다. 나는 그것을 명백한 해결책과 다른 뭔가의 예로서 주로 보여주었습니다. – Guffa

1

리눅스 커널에서 printf의 구현은 꽤 읽기 쉽습니다. lib/vsprintf.c:number()을 참조하십시오.

글쎄, 대부분 꽤 읽기 쉽습니다. do_div은 어셈블러가있는 매크로입니다.

관련 문제