2017-09-08 1 views
-4

int 생성자를 사용하지 않고 파이썬에서 정수로 16 진수를 나타내는 문자열을 변환하려고합니다.16 진수를 Int로 파이썬 없음 Int 생성자

예를 들어

내가 이것에 대해 갈 것이라고 어떻게

int("802",16) 

을하지 않고 그

output = 2050 

로 얻을 것 어떻게이

hexstring = "802" 

를 받았다면? 다음은

+2

왜 당신이 * 필요 *'int'을 피할 것 (초기 시작하는 합계 인) 0입니까? – chepner

+2

@chepner : 사소한 대답을 막는 제약 조건이있는 일반적인 숙제 문제. –

+2

'int()'의 작업을 직접 수행 할 수 있습니다. 즉,'(2 * 1) + (0 * 16) + (8 * 256)'의 구성 요소로 "802"구문을 분석 할 수 있습니다. –

답변

2
hexstring = "802" 
L=len(hexstring) 

def val(h_char): 
    # Note you need to extend this to make sure the lowercase hex digits are processed properly 
    return ord(h_char)- (55 if ord(h_char)>64 else 48) 

def sumup(sum,idx): 
    global hexstring # global variables are not recommended 
    L=len(hexstring) 
    return sum + 16**idx*val(hexstring[L-idx-1]) 

output = reduce(lambda a,b:sumup(a,b),range(L),0)) 


위의 단지 설명과 range(L)에 의해 생산 [0,1,2]의 목록에 값을
프로세스를 추가하지 않습니다. 함수 호출 sumup(sum, idx)=sum+16^idx*h_digit_at_idx 이루어진다 목록에 기재된 각 idx 들어

. (^ is ** is exp 위에서)

h_digit_at_idx = ord(h_char)- (55 if ord(h_char)>64 else 48)

ord(h_char)0,1...10,A,B,C,D,E,F

ord(h_char)-(55 if ord(h_char)>64 else 48은 각 문자에 대해 0,1...10,11,12,13,14,15 생산 진수 문자 48,49...57,65,66,67,68,69,70 생산 .

마지막으로 reduce 함수의 마지막 인수는

+0

내 솔루션은 16 * a + b와 같은 "감속기"를 사용했습니다 (문자열을 [0,16]의 정수 목록으로 변환 한 후 ]와 비슷한 'ord'트릭을 사용합니다 – jedwards

+0

소문자가 16 진수로 입력되면 신뢰할 수없는 결과가 발생합니다 OP가 소문자 16 진수에 대한 추가 조건을 추가하기 위해 명령문을 편집 할 수 있기를 바랍니다. – kaza