2進数の各桁を配列で記憶された巨大数字を、10進数に変換する関数。

配列の各要素の意味は以下の通り。

char配列の各要素が2進数の各桁に対応している。例えば、2進数 1011 に対応するchar配列 bin[] では、bin[0] = 1, bin[1] = 1, bin[2] = 0, bin[3] = 1。桁数は他の変数か定数で指示して下さい。

変換される10進数と配列の対応関係は上の2進数の場合と同様だ。例えば、10進数 321 に対応するちchar配列を dec とするならば、dec[0] = 1, dec[1] = 2, dec[2] = 3 となる。

この関数は、2進配列を10進配列に変換するもの。配列を長くすれば、理論上どんな大きさの2進数にも対応できる。なお、10進数の桁数は一般的に2進数の0.301倍以上と考えるといいだろう。つまり、

  10進数の桁数=2進数の桁数 * log102=2進数の桁数 * 0.301

と計算できるから。

<関数名>
  bin2dec —- 2進数を10進数に変換する

<形式>
  int bin2dec(char *dec, int bin_len, char *bin);

<引数>
  dec   出力 変換される10進数配列。
  bin_len 入力 2進数配列 char *bin の大きさ(桁数)
  bin    入力 2進数配列

<関数値>
  変換される10進数の桁数(10進数配列の有効要素数)

<注意事項>
  関数の内部に、可変長配列の新機能を利用している。古いコンパイラだと通らないかもしれないが、いまのgcc(Gnu C/C++コンパイラ)では問題なく使える。その機能を使いたくなければ、十分大きなサイズにして下さい。
  なお、入力パラメータの2進数配列 char *bin は本関数を使用後も内容が変更されない。

用例

<関数本体>
  bin2dec.c

<説明>
  2進数の各桁を2のべき乗として10進数に変換、いわゆる、ごく一般的な変換方法を使用している。

10進数の各桁を配列で記憶された巨大数字を、2進数に変換する関数。

混乱を避けるため、まず配列の記録方法を書いておく。

char配列 dec[] の各要素が10進数の各桁に対応している。最初の要素 dec[0] が右端の桁(下桁)に対応。例えば、10進数 321 に対応する配列は dec[0] = 1, dec[1] = 2, dec[2] = 3 となる。

10進数の桁数(つまり、配列の大きさ)は他の変数か定数で示す必要がある。配列の中に桁数を示す情報はない。

2進数についての記憶方法も同じ。2進数 1011 に対応するchar配列 bin[] では、bin[0] = 1, bin[1] = 1, bin[2] = 0, bin[3] = 1。10進数と同様、桁数は他の変数か定数を利用してください。

この関数は、10進配列を2進配列に変換するもの。配列を長くすれば、理論上どんな大きさの10進数にも対応できる。なお、2進数の桁数は一般的に10進数の3.322倍以上と考えるといいだろう。つまり、

  2進数の桁数=10進数の桁数 / log102=10進数の桁数 * 3.322

と計算できるから。

<関数名>
  dec2bin —- 10進数を2進数に変換する

<形式>
  int dec2bin(char *bin, int dec_len, char *dec);

<引数>
  bin    出力 変換される2進数配列。
  dec_len 入力 10進数配列 char *dec の大きさ(桁数)
  dec   入力 10進数配列

<関数値>
  変換される2進数の桁数(2進数配列の有効要素数)

<注意事項>
  関数の内部に、可変長配列の新機能を利用している。古いコンパイラだと通らないかもしれないが、いまのgcc(Gnu C/C++コンパイラ)では問題なく使える。その機能を使いたくなければ、十分大きなサイズにして下さい。
  なお、入力パラメータの10進数配列 char *dec は本関数を使用後も内容が変更されない。

用例

<関数本体>
  dec2bin.c

<説明>
  10進数を2で割っていき、余りを2進数の各桁とする。いわゆる、ごく一般的な方法で変換している。

2進数字列を、整数値に変換する関数。

たとえば、2進数字列 “101011” → 数値 43。

<関数名>
  binsz2int —- 2進数字列を整数値に変換する

<形式>
  int binsz2int(char *str);

<引数>
  str 2進数 ASCIZ文字列。先頭に符号 (+またはー) があってもOK。

<関数値>
  入力の2進数字列に対応する整数値(10進数)

<注意事項>
  整数値のオーバーフローに注意。

用例
  binsz2int(“-1101”);

<関数本体>
  binsz2int.c

<説明>
  2進数字列の先頭から、まずスペースを読み飛ばす。つぎに符号を処理し、2進数字の各桁を変換していく。

10進数字列を、整数値に変換する関数。

たとえば、10進数字列 “12345” → 数値 12345。

<関数名>
  sz2int —- 10進数字列を整数値に変換する

<形式>
  int sz2int(char *str);

<引数>
  str 10進数 ASCIZ文字列。先頭に符号 (+またはー) があってもOK。

<関数値>
  入力の10進数字列に対応する整数値(10進数)

<注意事項>
  整数値のオーバーフローに注意。

用例
  sz2int(“-6119”);

<関数本体>
  sz2int.c

<説明>
  10進数字列の先頭から、まずスペースを読み飛ばす。つぎに符号を処理し、10進数字の各桁を変換していく。

整数値を、16進数字列への変換関数。

たとえば、値 180 が 数字列(16進数字列) “B4” に変換される。

<関数名>
  int2hexsz —- 整数値を16進数字列へ変換する

<形式>
  void int2hexsz(char *str, int num);

<引数>
  str  (出力) 16進数ASCIZ文字列
  num (入力) 変換したい整数値(マイナスの値でもOK)

<関数値>
  なし

用例
  char str[15];
  int2hexsz(str, 12345);

<関数本体>
  int2hexsz.c

<説明>
  再帰法を使用。先行の数字については自分自身を呼出して対応し、最終桁だけを変換して処理する。その際、A-F への変換に注意すること。

整数値を、2進数文字列に変換する関数。

たとえば、値 13 が 数字列(2進数列) “1101” に変換される。

<関数名>
  int2binsz —- 整数値を2進数字列へ変換する

<形式>
  void int2binsz(char *str, int num);

<引数>
  str  (出力) 2進数ASCIZ文字列
  num (入力) 変換したい整数値(マイナスでもOK)

<関数値>
  なし

<注意事項>
  マイナスの整数値が、マイナス記号が先頭につく2進数字列に変換される。
  例: -100 → ”-1100100″

用例
  char str[50];
  int2binsz(str, 12345);

<関数本体>
  int2binsz.c

<説明>
  再帰法を使用。先行の数字については自分自身を呼出して対応し、最終桁だけを変換して処理する。
  なお、ASCIZ文字列とは、最後にヌル(Null) コードで終了する文字列のこと。

整数値を、10進数字列に変換する関数。

たとえば、値 13 が 数字列 “13” に変換される。

文字(数字)と数値、われわれ人間には、それらの表現はともにシンボル(記号的意味)でしかないので、全く同じにみえる。しかし、コンピュータの世界では違う。

文字(数字)と数値が、コンピュータの内部では異なる表現になっているから。

コンピュータ内部での文字表現を、文字コードという。もっともよく使われている文字コードはアスキーコード。プログラマを目指すひとなら、真剣にアスキーコード表を見てほしい。

アスキーコードでは、たとえば、文字の 1 は、16進数値 31、つまり2進数値の 110001 で表現される。すなわち、コンピュータの内部では、文字の 1 は 10進数値の 49 と同じ。

こんなわけで、「文字、文字列、数字、数字列」 と 「値、数値、整数値」とは混同しないでほしい。

<関数名>
  int2sz —- 整数値を10進数字列へ変換する

<形式>
  void int2sz(char *str, int num);

<引数>
  str  (出力) 10進数ASCIZ文字列
  num (入力) 変換したい整数値(マイナスでもOK)

<関数値>
  なし

<注意事項>
  マイナスの整数値が、マイナス記号が先頭につく数字列に変換される。
  例: -100 → ”-100″

用例
  char str[15];
  int2sz(str, 12345);

<関数本体>
  int2sz.c

<説明>
 再帰法を使用。先行の数字については自分自身を呼出して対応し、最終桁だけを変換して処理する。
 なお、ASCIZ文字列とは、最後にヌル(Null) コードで終了する文字列のこと。

C言語の標準関数 sprintf() が使える環境であれば、本関数と同じことを
    sprintf(str, “%d”, num);
で書くのはふつうだね。ただ、マイコンへの組込み等、プログラムの容量を少しでも減らしたいならば本関数も有用かな。

16進数字列を整数値に変換する関数。

たとえば、16進数字列 “A4C” → 値 2636。

<関数名>
  hexsz2int —- 16進数字列を整数値に変換する

<形式>
  int hexsz2int(char *str);

<引数>
  str 16進数ASCIZ文字列
  先頭に符号(+/-)が入ってもOK。各桁は0〜9、A〜F、または、a〜f。

<関数値>
  16進数字列に相当する整数値(10進数)

<注意事項>
  整数のオーバーフローに注意。

用例
  hexsz2int(“B6119”);

<関数本体>
  hexsz2int.c

<説明>
  16進数字列の先頭から、まずホワイトスペースを読み飛ばす。つぎに符号を処理し、16進数字の各桁を変換していく。各桁の 変換においては、0-9、A-F、a-fのような場合分けを考慮する。