- 2016-1-12
- Visual C++
この間、10進数から36進数を作る関数作ったけど今度は逆の36進数から10進数にする関数作ったよ。
セットで使えば便利。これも一応OS依存しないように作ったつもり。
#define DEF_BASE_DECIMAL (36) static const char decimalbase[36]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; void Base36ToDecimal( const char* x, unsigned long long int* z ) { if ( x == NULL || z == NULL ) return; char xwork[100]={NULL}; strcpy_s( xwork, sizeof(xwork), x ); unsigned long long int zwork = 0; unsigned long long int unpow = 0; //べき乗計算結果 size_t unLen = strlen(xwork); int ii; int kk; int jj; int mid,left,right; bool bFound = false; //見つかったフラグ for( ii = (int)unLen -1 , jj = 0 ; ii >= 0 ; ii-- , jj++ ) { //べき乗計算(PowerCalc) powに頼らない unpow = 1; for( kk = 0 ; kk < jj ; kk++ ) unpow *= DEF_BASE_DECIMAL; //該当文字列検索(2分探索/BinarySearch) bFound = false; left = 0; right = sizeof(decimalbase); while(left <= right) { mid = (left+right)/2; if ( x[ii] == decimalbase[mid] ) { bFound = true; break; } else if ( x[ii] < decimalbase[mid] ) right = mid - 1; else if ( x[ii] > decimalbase[mid] ) left = mid + 1; } if ( bFound != true ) return; //見つからない文字列があった zwork += ( unpow * mid ); } *z = zwork; }
使い方。
memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "Z", sizeof(mathy) ); mathx = 0; /* 35 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "10", sizeof(mathy) ); mathx = 0; /* 36 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "ZZ", sizeof(mathy) ); mathx = 0; /* 1295 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "100", sizeof(mathy) ); mathx = 0; /* 1296 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "ZZZ", sizeof(mathy) ); mathx = 0; /* 46655 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "1000", sizeof(mathy) ); mathx = 0; /* 46656 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "3W5E11264SGSF", sizeof(mathy) ); mathx = 0; /* 18446744073709551615(ULLONG_MAX) */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "1ZZZZZZZZZZZZ", sizeof(mathy) ); mathx = 0; /* 9476762676643233791 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "LKJIHGFEDCBA", sizeof(mathy) ); mathx = 0; /* 2839160736594340246 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "XWVUTSRQPONM", sizeof(mathy) ); mathx = 0; /* 4463748624018894610 */ Base36ToDecimal( mathy,&mathx); memset( mathy, 0, sizeof(mathy) ); memcpy( mathy, "9876543210ZY", sizeof(mathy) ); mathx = 0; /* 1214572849169787214 */ Base36ToDecimal( mathy,&mathx);
簡単でしょ。