이것이 모두 필요한 경우 특히 Objective-C++를 기꺼이 사용하려는 경우 구현하기가 어렵지 않습니다. Objective-C++을 사용하면 vector
을 사용하여 메모리를 관리 할 수 있으므로 코드가 간단 해집니다.
// NSString+BigDecimalToHex.mm
#import "NSString+BigDecimalToHex.h"
#import <vector>
// index 0 is the least significant digit
typedef std::vector<uint16_t> BigInt;
:
// NSString+BigDecimalToHex.h
@interface NSString (BigDecimalToHex)
- (NSString *)hexStringFromDecimalString;
@end
그것을 구현하기 위해, 우리는 기본-65536 숫자의 벡터로 임의 정밀도 음수가 아닌 정수를 나타내고 있습니다 : 여기
우리가 구현하는 것이다 인터페이스의
"어려운"부분은 BigInt
에 10을 곱하여 하나의 십진수를 더하는 것입니다. 우리는 이것을 미리로드 된 캐리로 장수 곱하기로 쉽게 구현할 수 있습니다.
static void insertDecimalDigit(BigInt &b, uint16_t decimalDigit) {
uint32_t carry = decimalDigit;
for (size_t i = 0; i < b.size(); ++i) {
uint32_t product = b[i] * (uint32_t)10 + carry;
b[i] = (uint16_t)product;
carry = product >> 16;
}
if (carry > 0) {
b.push_back(carry);
}
}
도우미 메서드를 사용하여 인터페이스를 구현할 준비가되었습니다. 첫째, 우리는 각 진수에 대해 한 번씩 도우미 메서드를 호출하여 BigInt
의 진수 문자열을 변환해야합니다 : 입력 문자열이 비어 있거나 모두 제로
- (NSString *)hexStringFromDecimalString {
NSUInteger length = self.length;
unichar decimalCharacters[length];
[self getCharacters:decimalCharacters range:NSMakeRange(0, length)];
BigInt b;
for (NSUInteger i = 0; i < length; ++i) {
insertDecimalDigit(b, decimalCharacters[i] - '0');
}
경우, b
가 비어 있습니다. 우리는 확인해야합니다
if (b.size() == 0) {
return @"0";
}
지금 우리는 16 진수 문자열로
b
변환해야합니다.
b
의 최상위 자릿수가 가장 높은 지수입니다. 앞에 0을 방지하기 위해, 우리는 특별히 그 자리를 처리 할 수 있습니다 :
다음
NSMutableString *hexString = [NSMutableString stringWithFormat:@"%X", b.back()];
우리 위해, 나머지 각 기본-65536 숫자 네 자리의 16 진수로 변환에서 가장 중요한 의미 이상으로 :
for (ssize_t i = b.size() - 2; i >= 0; --i) {
[hexString appendFormat:@"%04X", b[i]];
}
그리고 우리는 완료 :
return hexString;
}
당신은 내 전체 테스트 프로그램을 찾을 수 있습니다 (맥 명령 줄 프로그램으로 실행하기 위해) in this gist.
가장 쉬운 방법은 iOS 용 큰 정수 라이브러리를 찾는 것입니다. iOS 용으로 [MPIR] (http://www.mpir.org/)을 컴파일 해보십시오. –
[이 질문에 대한] 많은 주석가들 (http://stackoverflow.com/questions/1226949/biginteger-on-objective-c)이 언급해야 할 것은 C 용 BigInteger 라이브러리를 찾은 다음 Objective-C 코드에서 호출하십시오. – bdesham
[Objective-C의 기본 62 변환] 중복 가능 (http://stackoverflow.com/questions/14780246/base-62-conversion-in-objective-c) –