○10進数⇔16進数 変換

■10進数の値を16進数表記に変換する方法を考えてみたいと思います
まあ、各々の言語のライブラリを使えば簡単に出来るんですけど
たとえば、Cなら、

#include <stdio.h>
#include <stdlib.h>

int main(){
	printf("0x%x\n",2744);
	printf("%u\n",(unsigned long)strtol("0xAB8",NULL,0));
	return 0;
}


c:\>■■■.exe
0xab8
2744

のような感じで簡単に出来てしまいます


しかーし、
内部でどのように動作しているのかは、判らないですよねえ、
そこで、同一の機能を自分で作ってみようと思います。

なになに?そんなことしなくてもJAVAにも、C#にも、VBにも、○○にも、
同様の機能が含まれているから、そんなこと考えなくてもいいって?
ハッハッハ!

そうかもしれないが、ハッカーの言葉を勝手に解釈して引用すると

インターネットを学ぶ事がブラウザの操作を覚えることだとすれば、
そんなことはサルにでも出来ることです。
Web のマークアップ言語である HTML の書き方を覚え、
そしてインターネットの根底にあるIPについて学びなさい

ようするに、ライブラリだの、コントロールだの、上っ面の処理だけの結果を見て
理解したと思わずにその奥の本質部分を見て理解しろってことですな




■では、実際に10進数から16進数に変換する方法を見てみましょう

▼10進数の100を16進数に変換する




▼10進数の2744を16進数に変換する



これなら紙とペンで変換できそうです

では、上の計算方法をプログラム(C++)に置き換えてみます


#include <stdio.h>

int main(){
	unsigned int i;
	unsigned char buf[1024]="";
	unsigned char*str_ptr=&buf[sizeof(buf)-1];

	i=2882400018;

	while(i){
		*--str_ptr=i%16;
		if(10>*str_ptr){
			*str_ptr+=0x30;//0x30は0の文字コード
		}else{
			*str_ptr+=(0x41-0x0A);//0x41はAの文字コード
		}
		i/=16;
	}
	printf("0x%s\n",str_ptr);

	return 0;
}


まあ、とりあえずこれで変換できるはずです
ためしに実行

c:\>■■■.exe
0xABCDEF12

うん、関数電卓の計算と同じ結果がでました。




■次に、16進数を10進数に変換する方法を見てみたいと思います

▼16進数の0xAB8を10進数に変換する



一桁ずつ、掛けてゆくだけで変換できます

では、上の計算方法をプログラム(C++)に置き換えてみます


#include <stdio.h>
#include <math.h>
#include <string.h>

unsigned int trans(unsigned char c){
	if('0'<=c && '9'>=c) return (c-0x30);//0x30は'0'の文字コード
	if('A'<=c && 'F'>=c) return (c+0x0A-0x41);//0x41は'A'の文字コード
	if('a'<=c && 'f'>=c) return (c+0x0A-0x61);//0x61は'a'の文字コード
	return 0;
}

int main(){
	unsigned int i,j=0;
	char*str="0xABCDEF12";
	char*str_ptr=str+strlen(str)-1;

	for(i=0;i<strlen(str);i++){
		j+=trans(*str_ptr--)*(unsigned int)pow(16,i);
	}
	printf("%u\n",j);

	return 0;
}

これで16進数を10進数に変換できるはずです
では実行

c:\>■■■.exe
2882400018

結果が関数電卓で計算した結果と同じになりました
めでたしめでたし



20060921  作成


▲トップページ > プログラミングの実験