- ベストアンサー
2進数、16進数使用例
皆さんこんにちは。 先日後輩から、「2進数とか16進数って、どんな時にプログラムで使うんですか?」 と質問を受けました。 2進数や16進数→10進数、10進数→2進数や16進数の計算方法はわかりますが、 ”いつ、どこで、どのような場合”に使うかわかりません。 今は、パソコン自体の性能も向上し、メモリ不足という心配もなくなり、 ビット計算という機会も少なくなったせいかもしれませんが、私自身 プログラミングで見たり使ったりしたことがありません。 どなたかそういう使用例をご存知の方がおられれば、サンプルソースや そういう記事が載ってるサイトを教えて頂きたいと思います。 宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>”いつ、どこで、どのような場合”に使うかわかりません。 複数のON/OFFのフラグを関数の引数に渡す場合に使用します。 例えば、新規ウィンドゥを開く関数に、開く時のスタイルを指定する場合などは、各フラグを2進数に見立てて指定します。 ON/OFF可能なフラグが10個くらいあった時、引数を全部並べて書くのは面倒ですし、関数の呼び出し時のオーバーヘッドが大きくなるので、1つの引数にまとめた方が有利なのです。 また、複数のON/OFFのフラグを関数からの戻り値として返す場合も有効です。 例えば、関数を呼んだ結果、戻り値の第1ビットが1なら垂直スクロール可能、第2ビットが1なら水平スクロール可能、第3ビットが1ならサイズ変更可能、とか。 こういう使い方をすれば「関数は値を1つしか返せないけれども、複数の意味を持った結果が返せる」訳です。 WindowsのAPI関数などでも 「○○は以下のリストにある値を"|(OR)演算子"で結合したものを指定します」 と言う仕様の物があります。これも「複数の値を2進数に見立てて、まとめて指定する」と言う手法を用いています。 その他、ビット計算が必要になるケースでは「画像の重ね合わせ合成を行う」などがあります。 これの典型例が「マウスカーソルの描画」で、カーソルパターン(カーソルの見える部分のパターン)とマスクパターン(透明部分、不透明部分を指定する為のパターン)とカーソル下の元のパターンの3つに対し、複雑なビット演算を行って「背景やウィンドゥの上にマウスカーソルが乗った画像」を作り出して、画面に描画しています。 このように「ビット演算」は、今のパソコンには絶対必要不可欠ですが、その殆どは、アプリやユーザーが直接扱う事の無い基本機能の部分に集中していてOSやシステムに組み込み済みな為、実際のプログラミングで見聞きする事は滅多に無いと思います。
その他の回答 (4)
- fortranxp
- ベストアンサー率26% (181/684)
2進数>PCのCPU内でON/OFF処理のブール計算が 行われている。 16進数>PCのCPUを動かすためのプログラムは結果的に 全て2進数に変換されるがこの2進数を解読 するとき解り易いようにアセンブラという 言語がありますが主にここで使用される。
お礼
ご返事ありがとうございます。 今後の参考にします。
- jacta
- ベストアンサー率26% (845/3158)
> 2進数や16進数→10進数、10進数→2進数や16進数の計算方法はわかりますが、 > ”いつ、どこで、どのような場合”に使うかわかりません。 最も典型的なのは、ハードウェアを直接制御する場合です。 アドレスを指定したり、制御レジスタを設定・参照したり、入出力ポートを操作する場合などでは、16進数は必須です。 もちろん、論理演算を行う場合にも、16進数や2進数で考えないと、10進数で考えるのは難度が高すぎます。 > 今は、パソコン自体の性能も向上し、メモリ不足という心配もなくなり、 > ビット計算という機会も少なくなったせいかもしれませんが、 パソコンをターゲットとしたプログラムは、プログラムの分野全体から見れば、ごくごく一部に過ぎないことをお忘れなく。 ちなみに、C/C++では2進数を直接使うことはできません。文字列を介すか、16進数や8進数として使うことになります。
お礼
ご返事ありがとうございます。 今後の参考にします。
- iekarapin
- ベストアンサー率34% (9/26)
リアルタイムとか組み込みとか、リソースや速度を気にしているときに は、使うと思います。
お礼
ご返事ありがとうございます。
- m_mik
- ベストアンサー率26% (31/117)
自分で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)) { } こんな使い方ですね。
お礼
早速のご返事ありがとうございます。 今後の参考にします。
お礼
詳しいご回答ありがとうございます。 今後の参考にします。