スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

0-15(10進数)を0-F(16進数)に基数変換する関数dtoh

10進数(decimal number)の0-15を引数に取り、16進数(hexadecimal number)の0-Fを返す関数dtohを考えてみます。言語は何を選んでもよいのですが、わけあってここではC言語で書くことにします。

naiveな関数dtoh1

まず、この上なくnaiveな関数dtoh1からいきましょう。switch文で引数numの値に応じて場合分けしてcase 0~case 15まですべて列挙してあります。


char dtoh1(int num) {
  switch(num) {
  case 0:
    return '0';
  case 1:
    return '1';
  case 2:
    return '2';
  case 3:
    return '3';
  case 4:
    return '4';
  case 5:
    return '5';
  case 6:
    return '6';
  case 7:
    return '7';
  case 8:
    return '8';
  case 9:
    return '9';
  case 10:
    return 'A';
  case 11:
    return 'B';
  case 12:
    return 'C';
  case 13:
    return 'D';
  case 14:
    return 'E';
  case 15:
    return 'F';
  default:
    return 'Z';
  }
}

if文を用いた関数dtoh2

次に、10進数の0-9は16進数においても同じ数字であることを利用し、コードを短くした関数dtoh2です。('0' + num)という表現は一度見たことがないと書けないと思います。


char dtoh2(int num) {
  if(num<10) return ('0' + num);
  switch(num) {
  case 10:
    return 'A';
  case 11:
    return 'B';
  case 12:
    return 'C';
  case 13:
    return 'D';
  case 14:
    return 'E';
  case 15:
    return 'F';
  default:
    return 'Z';
  }
}

配列を用いた関数dtoh3

さて、これまでのコードではswitch文を用いた場合分けをしていましたが、これを使わずに書くことはできないのでしょうか?実はできます。それが以下に記した関数dtoh3です。戻り値をあらかじめ配列に並べて格納しておくことでswitch文を使わずに実装することができます。


char dtoh3(int num) {
  char str[] = {
    '0', '1', '2', '3', '4',
    '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 'F'};
  return str[num];
}

文字列リテラルを利用した関数dtoh4

最後に、このコードをさらに短く書いてみたいと思います。C言語の文字列リテラルはcharへのポインタなので、[]演算子のオペランドになります。これを利用したのが次の関数dtoh4です。なんと、関数の中身が1行で書けてしまいました。


char dtoh4(int num) {
  return "0123456789ABCDEF"[num];
}

関連記事

参考にした書籍

配列を用いた関数dtoh3は基本情報技術者試験の過去問題(H16秋午後問4)を解いたときに得た発想です。

2008 基本情報技術者 午後問題の重点対策 (情報処理技術者試験対策書)
4872686527アイテック情報技術教育研究部

アイテック 2007-12-25
売り上げランキング : 3555


Amazonで詳しく見る
by G-Tools

また、dtoh4は下の書籍で紹介されていたテクニックを利用しています。

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
C言語ポインタ完全制覇 (標準プログラマーズライブラリ)前橋 和弥

技術評論社 2001-01
売り上げランキング : 2814
おすすめ平均star


Amazonで詳しく見る
by G-Tools

C言語の入門書

C言語の入門書としてはこちらの書籍がおすすめです。やさしくわかりやすく書かれています。
やさしいC 第3版 [やさしいシリーズ]
4797343664高橋 麻奈

ソフトバンククリエイティブ 2007-08-30
売り上げランキング : 59451


Amazonで詳しく見る
by G-Tools

スポンサード リンク

テーマ:プログラミング - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

00 : 52 : 31 | プログラミング-C/C++ | トラックバック(0) | コメント(2) | page top↑
<<10進数の整数値を16進数の文字列に基数変換するメソッドdtoh_ex | ホーム | C言語におけるスタック領域の使われ方>>
コメント
dtohについて
参考になりました。非常にスマートですね!

ただ配列の場合、要素数が16以上だとエラーになるのでは?
by: funsuke * 2008/02/10 10:59 * URL [ 編集] | page top↑

>funsukeさん
ありがとうございます。
配列バージョンの指摘ですが、おっしゃる通りです。ここでは、スマートな実装を優先したため、dtoh3とdtoh4は16以上の値や負の値など想定外の引数を渡された場合の動作は保証していません。
by: TBVector * 2008/02/10 21:47 * URL [ 編集] | page top↑

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/8-c58c0eab
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。