• ベストアンサー

ビット演算子

bnosuke-xの回答

  • ベストアンサー
  • 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
質問者

お礼

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

関連する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進数のデータをビット演算するにはどうすればよろしいでしょうか。 ご存知の方、ご教授よろしくお願いいたします。