• ベストアンサー

2進数、16進数使用例

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

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

>”いつ、どこで、どのような場合”に使うかわかりません。 複数のON/OFFのフラグを関数の引数に渡す場合に使用します。 例えば、新規ウィンドゥを開く関数に、開く時のスタイルを指定する場合などは、各フラグを2進数に見立てて指定します。 ON/OFF可能なフラグが10個くらいあった時、引数を全部並べて書くのは面倒ですし、関数の呼び出し時のオーバーヘッドが大きくなるので、1つの引数にまとめた方が有利なのです。 また、複数のON/OFFのフラグを関数からの戻り値として返す場合も有効です。 例えば、関数を呼んだ結果、戻り値の第1ビットが1なら垂直スクロール可能、第2ビットが1なら水平スクロール可能、第3ビットが1ならサイズ変更可能、とか。 こういう使い方をすれば「関数は値を1つしか返せないけれども、複数の意味を持った結果が返せる」訳です。 WindowsのAPI関数などでも 「○○は以下のリストにある値を"|(OR)演算子"で結合したものを指定します」 と言う仕様の物があります。これも「複数の値を2進数に見立てて、まとめて指定する」と言う手法を用いています。 その他、ビット計算が必要になるケースでは「画像の重ね合わせ合成を行う」などがあります。 これの典型例が「マウスカーソルの描画」で、カーソルパターン(カーソルの見える部分のパターン)とマスクパターン(透明部分、不透明部分を指定する為のパターン)とカーソル下の元のパターンの3つに対し、複雑なビット演算を行って「背景やウィンドゥの上にマウスカーソルが乗った画像」を作り出して、画面に描画しています。 このように「ビット演算」は、今のパソコンには絶対必要不可欠ですが、その殆どは、アプリやユーザーが直接扱う事の無い基本機能の部分に集中していてOSやシステムに組み込み済みな為、実際のプログラミングで見聞きする事は滅多に無いと思います。

ichigo_ichie
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.5

2進数>PCのCPU内でON/OFF処理のブール計算が     行われている。 16進数>PCのCPUを動かすためのプログラムは結果的に     全て2進数に変換されるがこの2進数を解読     するとき解り易いようにアセンブラという     言語がありますが主にここで使用される。

ichigo_ichie
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> 2進数や16進数→10進数、10進数→2進数や16進数の計算方法はわかりますが、 > ”いつ、どこで、どのような場合”に使うかわかりません。 最も典型的なのは、ハードウェアを直接制御する場合です。 アドレスを指定したり、制御レジスタを設定・参照したり、入出力ポートを操作する場合などでは、16進数は必須です。 もちろん、論理演算を行う場合にも、16進数や2進数で考えないと、10進数で考えるのは難度が高すぎます。 > 今は、パソコン自体の性能も向上し、メモリ不足という心配もなくなり、 > ビット計算という機会も少なくなったせいかもしれませんが、 パソコンをターゲットとしたプログラムは、プログラムの分野全体から見れば、ごくごく一部に過ぎないことをお忘れなく。 ちなみに、C/C++では2進数を直接使うことはできません。文字列を介すか、16進数や8進数として使うことになります。

ichigo_ichie
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • iekarapin
  • ベストアンサー率34% (9/26)
回答No.2

リアルタイムとか組み込みとか、リソースや速度を気にしているときに は、使うと思います。

ichigo_ichie
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.1

自分で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)) { } こんな使い方ですね。

ichigo_ichie
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3進数を10進数に変換

    3進数や5進数のように2の階乗ではない任意の進数の文字列を、C言語のビットシフトを使って10進数に変換するプログラムについて、質問させていただきます。 ビットシフトを使わないで、任意の進数の文字列を10進数に変換する方法は分かっていますが、ビットシフトを使った方が非常に計算が高速で出来るので、ビットシフトを使いたいと思っています。 下記のプログラムは4進文字列を10進整数に変換するものです。2進、8進文字列の場合は、シフトするビット数を1ビット、3ビット(つまり、ans <<= 1、ans <<= 3)にすれば計算することが可能です。しかし、3進数や5進数の場合、いろいろと考えたのですが、どのようにすれば良いのか分かりません。 下記のプログラムのようにビットシフトを使って3進数や5進数の文字列を10進数に変換するには、どのように工夫すれば良いでしょうか? どなたかご教授をお願いいたします。 #define STRING_NUM 2 /* 文字列の長さ */ int main(void) { int i; int ans = 0; /* 10進数の整数 */ char buf[STRING_NUM]; /* 4進数の文字列 */ buf[0] = '3'; buf[1] = '1'; for ( i = 0 ; i < STRING_NUM; i++ ){ printf(" %c", buf[i]); } printf("\n"); for ( i = 0 ; i < STRING_NUM; i++ ){ if ( buf[i] == '0' ){ ans <<= 2; /* シフトするビット数 */ ans |= 0; } if ( buf[i] == '1' ){ ans <<= 2; ans |= 1; } if ( buf[i] == '2' ){ ans <<= 2; ans |= 2; } if ( buf[i] == '3' ){ ans <<= 2; ans |= 3; } } printf( "ans = %d\n", ans ); return 0; }

  • 質問内容のサンプルソース

    こんにちは。 OKWaveにプログラミングの質問をする際に、 質問内容にサンプルソースを張り付けると、文字数制限に引っかかってしまいます。 文字数以上のサンプルソースの時みなさんどうされているんでしょうか?

  • メモリの周波数とFSBの関係について

    メモリの周波数とFSBはどのように関係しているのでしょうか? メモリがもし仮にDDR400(=DDR-SDRAM、1秒間に4億回の命令を実行できるといういみですよね?)でデュアルチャネルだったらFSBは800より上の値ではメモリの性能を最大に発揮できないという意味では、意味ががないということですか? あと教えてgooでこのDDRの400とは >DDR400の「400」は「1秒あたり、ピン1本あたりの転送ビット数(Mビット単位)」を表しています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1690185 とお聞きしたんですが、転送ビット数と周波数はまったく同じ意味と考えていいわけですよね?周波数は1秒間にそれだけの命令を実行できるという意味なんですから。

  • C++での24bit符号付き整数値の処理

    現在wavファイルからデータを読み出し、少数倍して再び格納するプログラムを作成しています。 量子化ビット数が16,32bitの場合は読み出したデータをshort型,int型の変数に入れて、そのまま計算が出来るのですが、C++には24bitの変数型がないため、24bitデータの処理に苦戦しています。 1サンプルあたり24bitで格納されているデータを読み出し、(double)倍したのち再び24bitずつ(3byte間隔で)書き込むにはどのようにすれば良いでしょうか? 一度int型に格納し、計算してから上位3byteを書き込む方法が簡単だとは思うのですが、負の値の扱いに困っています。 どなたかサンプルプログラムをお教えいただけると幸いです。

  • このプログラム例が何を伝えようとしているのか分かりません(C言語)

    下記のプログラムは『独習C 第3版』に記載されている、あるソースコードです。 #include <stdio.h> int main(void) { short i; i = 1; i = i | 32768; printf("%hd", i); return 0; } 【質問】 このプログラムの説明として、 『次のプログラムは、最上位ビットをセットすることにより、iを負数にします(ここでは、短整数が16ビットであると仮定しています)。』 とありますが、実際に実行してみると、 -32767 となり、iが負数の-1になっていません。 自分で 1000 0000 0000 0000 (32768) 0000 0000 0000 0001 (i) --------------------------- 1000 0000 0000 0001 OR として計算して、答えをWindows付属の電卓で確認したら「32769」になります。 このプログラムは何を伝えようとしているのでしょうか? どうして「-1」ではなく「-32767」のような結果になるのでしょうか? どなたか教えて頂けないでしょうか?

  • 素数判定プログラム

    C言語で、『n以下のすべての素数を求めるプログラム』のソースリストを平方根を使ったやり方で作りたいのですが、エラーが出てしまって、どうしてもうまく作れません。 C言語初心者の上、勉強不足なのが悪いのですが・・・ぜひ教えてください!お願いします!

  • 複数のソースからなるプログラムの実行

    windowsで、Cを勉強中のプログラミング初心者です。 複雑なプログラムっていくつかの名前で、複数のソースから成っていますよね。そういうプログラムを動かしたいのですが、どうやってコンパイル、実行したら良いのですか? 以下のサイトのサンプルを、ソースコードから動かしたいと思っています。 http://www.oreilly.co.jp/books/9784873113395/download.html

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • VC++2010、ADボードを用い周波数を出す方法

    VC++2010、ADボードを用い周波数を出す方法を探しているんですが どこを探してもそういうサンプルプログラムがなく困っています。 デバイスをオープンとかファンクションジェネレータからアナログ波形の入力その電圧値を 取得などは出来るんですが、その周波数を出す方法が分かりません。 なにか良い方法、サンプルプログラムなどはありませんか?よろしくお願いします。 ちなみにADボードは12ビットの分解能のPCI3163で、VC++2010でファンクションジェネレータから出力されるアナログ波形のをADボードを経由してもらい、その後 周波数を出す考えでいます。 ちなみにファンクションジェネレータから出力している周波数は80kHzであります。 ではよろしくお願いします。

  • 「情報の損失を防ぐためにプログラムを終了してくださ

    win8 64bit メモリ8Gです。 ie11です。 「情報の損失を防ぐためにプログラムを終了してください 」 「コンピューターのメモリが不足しています。ファイルを保存し、これらのプログラムを終了してください。」 Evernote 「windowsは必要なメモリを復元できるだけのプログラム飲みを終了します。」 と表示されました。 タスクマネージャーを見たら Evernote (32ビット)メモリ319MB なのですが これはメモリが不足しているのでしょうか? メモリの全体のパーセンテージは64%になっています。