• ベストアンサー

ビット演算子

& | ~ ^のビット演算子はどんな場面で使いますか? いまひとつ、ビット演算子が理解できません。 使いこなすには、二進数の表現、16進数の表現にも詳しくないとだめでしょうか? ビット演算子を使わなければならない場面、ビット演算子を使うメリットを教えてください。 お願いします。

noname#168725
noname#168725

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

  • ベストアンサー
  • bnosuke-x
  • ベストアンサー率39% (43/110)
回答No.5

>ビット演算子を使わなければならない場面、ビット演算子を使うメリットを教えてください。 ビット演算は、整数型の中の特定ビットを操作するために使います。 主に8ビットや16ビットの中に、ビット単位の情報が複数パックされたものを操作する場面で使います。 具体的な場面として以下の2つを挙げます。 1.I/Oポートの読み書き 組込機器のプログラミング等で、マイコンチップに接続された機器はI/Oポートを介して制御します。 ある1本のピンのHigh/Lowは、I/Oポートの一つのビットの0/1に対応します。 外部のセンサーやスイッチの状態を知りたいときはそのビットを読み、逆に書き込みをすればLEDの点灯/消灯などをすることができます。 このようにI/Oポートを経由すれば外部とやりとりできますが、この 読み書きは1または2バイト単位で行います。つまり、ピン8本または16本まとめてということです。 このとき、目的のピンのみの情報を知るor書き込むときにビット演算が必要です。 具体的な操作は#2さんの例を良く理解してください。 2.画像データファイルの取り扱い 仮に1バイト=1ピクセルで赤3ビット、緑3ビット、青2ビットとか、 2バイト=2ピクセルで赤緑青共に5ビットで格納する形式があったとして、 各色の値を取り出すときはビットごとの操作が必要になります。 >& | ~ ^のビット演算子はどんな場面で使いますか? & - 特定のビットを0にする、または特定のビットだけを取り出し他を0にする | - 特定のビットを1にする ^ - 特定のビットを反転する ~ - 全部反転する 基本はこんな感じです。 これにシフトを組み合わせて色々な操作を行います。 #3さんの説明されているマスキングは非常に重要で基本的なテクニックです。 (data8 = (unsgined char)(data32 & 0xff);が正しい記述だと思いますが...(^_^;)) >使いこなすには、二進数の表現、16進数の表現にも詳しくないとだめでしょうか? プログラムを作る人間なら知っていて普通であって欲しいことですし、詳しいとか詳しくないというレベルのことではないので、きちんと勉強してください。 単に10,2,16,8進数相互の変換ができればいいです。 最低限2進数<->16進数の変換ができればプログラムは書けなくもないです。 また、C言語では2進数形式でプログラムは書けないので、代わりに16進数表記で書くことになりますので、16進数には慣れておくと便利です。 >ビット演算子を使うメリットを教えてください。 メリットは特にありません。 ビット単位の操作を行うときには必ず使うものなので、メリットも何も.. 足し算をするときに+演算子を使うようなものです。

noname#168725
質問者

お礼

回答ありがとうございます。 どうも! いろいろ詳しく書かれているので、たいへんに勉強になりました! 解りやすかったです! どうもありがとうございます!

その他の回答 (4)

回答No.4

#3さんの回答の前半は何を勘違いされているのかビット演算子については言及されておりませんので、 後半のビット演算子の典型的な無意味な使用例のみ参照されるとよいでしょう。 まぁ、気付くとは思いますが、typoも多いのでその点にもご注意を。 結論。使わなければならない場面に遭遇しない限り、積極的に使う必要はありません。 また、16進数の表現に馴れている必要は必ずしもありませんが、2進数の知識は不可欠です。 #尤も、それらはデバッグ時においても役に立つ知識ではありますが。

noname#168725
質問者

お礼

回答ありがとうございます。 右も左も解らない初心者なのでいろいろ参考になりました。 ありがとうございます。

  • daivin
  • ベストアンサー率40% (2/5)
回答No.3

一般的にはbool変数を用いる祭に利用することが多いのがビット演算子だと思います。 bool Condition1, Condition2; ... if (Condtion1 && Condition2) { // 状態1と状態2が同時に真なら ... } else if (Condtion1 || Condition2) { // 状態1と状態2のどちらかが真ならば ... } という具合で条件分岐の判定で利用する場合があります。 また具体的な事例では画像処理などにおいて 32ビットのデータを8ビットのデータに変換するときに利用します。 int data32; unsigned char data8 data8 = (unsgined cahr)data32 & 0xff; マスキングといって32ビットの変数にある値の下位8ビットのみを代入しています。 マスキングを忘れることで出力画像が予想しないものになる場合があります。

noname#168725
質問者

お礼

回答ありがとうございます。 コードの紹介ありがとうございます。 参考にします!

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

組み込み系プログラマです。 ビット演算を使う例としてマルチタスク処理のイベントフラグを挙げます。8bitのイベントフラグがあって、次のようにイベントが割り当てられていたとします。 #define EVENT_1 0x01 #define EVENT_2 0x02 #define EVENT_3 0x04 #define EVENT_4 0x08 #define EVENT_5 0x10 #define EVENT_6 0x20 #define EVENT_7 0x40 #define EVENT_8 0x80 これらのイベントは複数のタスクから同時にセットされることがあり、イベントを取り出すときは一つずつ取り出して処理するものとします。 ここで、イベントフラグ event_flag にEVENT_1とEVENT_4が同時にセットされていたとします。具体的には event_flag = 0x09 という値になっていたとします。イベントフラグを読み出して処理を実行するタスクは、どうしたら event_flag に EVENT_1 が入っているかどうか判別できるでしょうか? その答えは、ビット演算子の&を使って、 if( event_flag & EVENT_1 ){   EVENT_1に対応した処理(); } です。ビット演算子を使わなかったらどのような演算で判断するか考えてみてください。結構手間ですよね。 さらに、イベントフラグから EVENT_1 を消すには、 event_flag |= ~EVENT_1; です。 分かりやすくするために筆算で書くと、  event_flag = 0000 1001  EVENT_1  = 0000 0001 なので、   event_flag = 0000 1001 (or)~EVENT_1  = 1111 1110 --------------------------   event_flag = 0000 1000 となり、EVENT_1 が消えます。 イベントフラグに限らず、(組み込みの世界で言えばハードウェアを制御するためのポートなど)1ビット単位で意味のあるものを扱おうとすると、必然的にビット演算を使います。 > 使いこなすには、二進数の表現、16進数の表現にも詳しくないとだめでしょうか? ここで例としてあげた2進表現、16進表現が分かる程度の知識は必要です。 > ビット演算子を使うメリットを教えてください。 CPUは命令セットの中にビット演算を持っているものがほとんどなので、ビット演算は多くの場合1クロックで処理が終わります。これは大きなメリットだと思います。

noname#168725
質問者

お礼

回答どうもありがとうございます。 回答の内容にちょっとついていけないぐらいの初心者ですが、 将来参考になりそうです。 どうもありがとうございます!

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

>& | ~ ^のビット演算子はどんな場面で使いますか? FindFirst等で、ファイルの属性を調査、設定する場合に必須。 その他、ライブラリ関数には「1つの引数の各ビットに意味を持たせ、多数の情報を引数1つで渡す」「戻り値の各ビットに意味があって、多数の情報を戻り値1つで返す」と言う仕様の物が数多くあります。

noname#168725
質問者

お礼

すばやい回答ありがとうございます。 参考になります! ありがとうございます。

関連するQ&A

  • C言語のビット演算子について

    C言語のビット演算子に関する質問です。 ビット単位の演算とは、どのような場面で使用されているものなので しょうか? また、ビット単位の演算が行えることにどのようなメリットがあるの でしょうか? 基本的な質問で申し訳ございませんが、どなたかご回答頂けますか?

  • ビット演算子について

    ビット演算子のことがよく分かりませんので、結果の求め方を教えてください。ちなみに16進数、2進数などは分かります。 〈例〉(1) 0xf0 & 0xaa     (2)~0x55

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • ビット演算子~について。

    質問があるのですがよろしくお願いします。 環境は Windows Home Editon PHP 5.2.0 Apache 2.2.3 です。 PHPのビット演算子、「~」についてなのですが、 http://wisdom.sakura.ne.jp/programming/php/php8.html このページを見ると、~が式のビットを全て反転させる演算子であると書いてあるのですが、 echo ~5; を実行すると、なぜかブラウザに表示されるのは-6です。 10進数の5を2進数に変換すると0101で、それを~演算子を使って反転させると1010なので、ブラウザに表示される数字は10であるべきではないのでしょうか。返り値が-6という負数になってしまうのも何故だか分かりません。 詳しい方いらっしゃいましたら、ご教授頂けると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ビット演算子について

    あるプログラムの中で下記のようなif文の記述を見かけました。 どういう計算をしてif文の判定を行っているのでしょうか。 (1)256を2進数に変換して → 100000000 (2)0x00000004を2進数に変換して → 100 (3)100000000 & 100 のビットAND演算を行う そもそも(3)で100000000 と 100 では桁数が違うけどどうやって両者でビット演算するので しょうか。100を 000000100というように0を補完して計算すればよいのでしょうか。 その場合、100000000 & 000000100 → 000000000(2進数) → 0(10進数) となりif文の中には入らないことになると思います。 if(256 & 0x00000004 != 0)

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • ビット演算??? 初学者 Python 2

    Pythonを学ぼうと思い、文字列の入力とか、ド初心者級のことから始めておりますが、諦めそうかな的な壁にぶつかっております。 ビット演算って、なんでしょう。これは必須の知識ですか?ここで覚えておくべきですか??? また、2進数6進数への10進数からの変換はプログラミングするならパッとできないとだめですか? ご回答おねがいします。

  • ビット演算子

    掲題の件ですが、 ネットを調べていて他の言語のビット演算子は見つけることができたのですが、Visual Basicでのビット演算子が見つかりませんでした。 ビットシフトだと A >> 2 A << 2 などとかかれていたのですが、これは使えるのでしょうか? よろしくお願いいたします。

  • ビット演算を学びたい

    a &= 2; a |= 2; a ^= 2; a ~= 2; a <<=2; a >>=2; みたいな感じでビット演算が使われているソースを 良く見るのですが、いまいちビット演算で何をしているのかが 分かりません。 参考書などには文字通りビットをいじるような旨のことが書いてあります。 (こちらにも同じようなことが http://www9.plala.or.jp/sgwr-t/c/sec14.html) こういうので何となくは分かるのですが、 実際にこれを何に使えるか、実践ではどのように使うのかが なかなか見えてきません。 このビット演算を私のような者でも実際のプログラムで使いこなせるように なれるようなサイトや書籍の提示、あるいはサンプルのプログラムなどで ご指導いただけたらと思います。

  • 2進数データのビット演算

    vb.netにて 0と1からなる2進数で記録した2つの値をビット演算したいと思っております。 Convert.ToInt32("1111101000", 2) などを使って、一度数値に変換して演算すれば、計算可能なことはわかったのですが、計算に利用したいデータが2進数で1000桁ほどあります。桁数が多い場合、Convert.ToInt32ではエラーが出て実行できません。 無数に長い2進数のデータをビット演算するにはどうすればよろしいでしょうか。 ご存知の方、ご教授よろしくお願いいたします。