プロが教える店舗&オフィスのセキュリティ対策術

皆さんこんにちは。
先日後輩から、「2進数とか16進数って、どんな時にプログラムで使うんですか?」
と質問を受けました。
2進数や16進数→10進数、10進数→2進数や16進数の計算方法はわかりますが、
”いつ、どこで、どのような場合”に使うかわかりません。
今は、パソコン自体の性能も向上し、メモリ不足という心配もなくなり、
ビット計算という機会も少なくなったせいかもしれませんが、私自身
プログラミングで見たり使ったりしたことがありません。
どなたかそういう使用例をご存知の方がおられれば、サンプルソースや
そういう記事が載ってるサイトを教えて頂きたいと思います。
宜しくお願いします。

A 回答 (5件)

>”いつ、どこで、どのような場合”に使うかわかりません。



複数のON/OFFのフラグを関数の引数に渡す場合に使用します。

例えば、新規ウィンドゥを開く関数に、開く時のスタイルを指定する場合などは、各フラグを2進数に見立てて指定します。

ON/OFF可能なフラグが10個くらいあった時、引数を全部並べて書くのは面倒ですし、関数の呼び出し時のオーバーヘッドが大きくなるので、1つの引数にまとめた方が有利なのです。

また、複数のON/OFFのフラグを関数からの戻り値として返す場合も有効です。

例えば、関数を呼んだ結果、戻り値の第1ビットが1なら垂直スクロール可能、第2ビットが1なら水平スクロール可能、第3ビットが1ならサイズ変更可能、とか。

こういう使い方をすれば「関数は値を1つしか返せないけれども、複数の意味を持った結果が返せる」訳です。

WindowsのAPI関数などでも
「○○は以下のリストにある値を"|(OR)演算子"で結合したものを指定します」
と言う仕様の物があります。これも「複数の値を2進数に見立てて、まとめて指定する」と言う手法を用いています。

その他、ビット計算が必要になるケースでは「画像の重ね合わせ合成を行う」などがあります。

これの典型例が「マウスカーソルの描画」で、カーソルパターン(カーソルの見える部分のパターン)とマスクパターン(透明部分、不透明部分を指定する為のパターン)とカーソル下の元のパターンの3つに対し、複雑なビット演算を行って「背景やウィンドゥの上にマウスカーソルが乗った画像」を作り出して、画面に描画しています。

このように「ビット演算」は、今のパソコンには絶対必要不可欠ですが、その殆どは、アプリやユーザーが直接扱う事の無い基本機能の部分に集中していてOSやシステムに組み込み済みな為、実際のプログラミングで見聞きする事は滅多に無いと思います。
    • good
    • 0
この回答へのお礼

詳しいご回答ありがとうございます。
今後の参考にします。

お礼日時:2006/02/08 18:01

2進数>PCのCPU内でON/OFF処理のブール計算が


    行われている。

16進数>PCのCPUを動かすためのプログラムは結果的に
    全て2進数に変換されるがこの2進数を解読
    するとき解り易いようにアセンブラという
    言語がありますが主にここで使用される。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。
今後の参考にします。

お礼日時:2006/02/08 18:02

> 2進数や16進数→10進数、10進数→2進数や16進数の計算方法はわかりますが、


> ”いつ、どこで、どのような場合”に使うかわかりません。

最も典型的なのは、ハードウェアを直接制御する場合です。
アドレスを指定したり、制御レジスタを設定・参照したり、入出力ポートを操作する場合などでは、16進数は必須です。
もちろん、論理演算を行う場合にも、16進数や2進数で考えないと、10進数で考えるのは難度が高すぎます。

> 今は、パソコン自体の性能も向上し、メモリ不足という心配もなくなり、
> ビット計算という機会も少なくなったせいかもしれませんが、

パソコンをターゲットとしたプログラムは、プログラムの分野全体から見れば、ごくごく一部に過ぎないことをお忘れなく。

ちなみに、C/C++では2進数を直接使うことはできません。文字列を介すか、16進数や8進数として使うことになります。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。
今後の参考にします。

お礼日時:2006/02/08 18:01

リアルタイムとか組み込みとか、リソースや速度を気にしているときに


は、使うと思います。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

お礼日時:2006/02/08 17:59

自分で16進数を使う場合というと…



ON/OFFだけのフラグを1つの変数にまとめておく時に使用します。
貧乏性なためかも知れませんが、それぞれのフラグにchar/intなどを割り当てる気にはなりません。

#define FLAG_A 0x00000001
#define FLAG_B (FLAG_A << 1)
#define FLAG_C (FLAG_B << 1)

int flag = 0;

// フラグAがたっていたときの処理
if (flag & FLAG_A)
{
}

// フラグBとCがたっていたときの処理
if ((flag & FLAG_B) && (flag & FLAG_C))
{
}

こんな使い方ですね。
    • good
    • 0
この回答へのお礼

早速のご返事ありがとうございます。
今後の参考にします。

お礼日時:2006/02/08 17:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!