36進数から10進数を作る

  • デル株式会社
  • この間、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);
    

    簡単でしょ。

    関連記事

    ページ上部へ戻る