• ベストアンサー

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

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

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★過去質問より。 ・次の過去質問をちょっと見て下さい。  http://oshiete1.goo.ne.jp/qa3132505.html→『C言語での数字の花形表示』  この質問を読み回答No.1と回答No.6を見比べて下さい。  私の回答ではビット演算(AND)を利用して花文字の表示をしています。  データの作り方にもよりますがビット演算などを上手く利用すると  すっきりと処理できるようになります。 ・他にも経路ゲームで『壁=0』『道=1』の2つで構成されるマップがあるとします。  このマップが256×256の大きさだと  char型で表現すると65,536バイト  int型で表現すると262,144バイト  のデータ量になります。※int型は32ビットとする。  迷路のマップが100ステージあると物凄いデータ量になります。  このような場合はchar型(int型)よりもビットで『壁』『道』を表現すれば  1マップは256×256の大きさでも32×32=1024バイトですみます。  データの圧縮にもなります。 ・このデータを読み取るときにはビット演算を駆使すれば迷路パターンを読み取れます。  このように工夫次第でいろいろと活用できるのです。  ポインタも使い次第では便利ですので。同じことです。

masy0312
質問者

お礼

具体的なご説明ありがとうございます。 非常に勉強になります!

その他の回答 (4)

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

>ビット単位の演算とは、どのような場面で使用されているものなので >しょうか? 他の回答の通りです。 >また、ビット単位の演算が行えることにどのようなメリットがあるの >でしょうか? 直接のメリットは「関数に、真か偽のみの値を複数個渡す場合に、高速に値渡しが出来る」くらいです。 他の回答の >int fd = open(filename, O_WRONLY | O_APPEND | O_CREAT); も「読み書き可が真」と「アペンド可が真」と「新規作成が真」の3つの値を渡すのに「一つの引数」で済ませています。

masy0312
質問者

お礼

なるほどですね。 了解しました、ありがとうございます!

回答No.3

こんばんは。 メリットと使われ方の場面を、ほぼ言葉のみにて書かせて頂きます。 質問者様におかれまして、ご参考になれば幸いかと存じ上げます。 メリットを(使われます場面との関連性が大です) 1. 高速で計算可能な CPU において、演算の速度が、高速です。 2. メモリの消費量を、最小限に抑えうる事が出来ます。 3. 1つの変数で、複数の情報を持つ事が出来ます。 等です。 使われています場面を。 ハードウェア(デバイス系、制御系等)を、直接操作するプログラムにおいて、 プログラムミングの際に、ビット単位で情報を、表現する場合に使われます。 最高速で、無駄の無い演算処理を、行う部分がほとんどです。 演算処理や暗号化等、非常に高い処理能力が、必要になる場合に使われます。 但し、学んで行く過程、趣味等は除きますが。 追記です。現在、補足が書けない状態ですので、ご存知でしたら失礼m(__)m ビット演算を行う変数は、符合なし( unsigned )変数を使うのが普通ですが、 ビット単位でデータ操作をする為、対象は整数( int )に限られます。 個人で、PC 向けのプログラムでは、ほとんど用いられる事は、なくなりましたが、 使われないとも限りません(メンテナンス時に、わかりにくくなる為) #現在補足を頂いても、私情にてほぼ不可能ですので、 #誠に申し訳御座いませんが、その点は何卒ご了承のほどをお願い致します。

masy0312
質問者

お礼

丁寧でわかりやすいご回答ありがとうございます。 非常に参考になりました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

一番よく使うのはフラグの操作です。関数の引数としてオプション情報を渡す場合などに使います。 例えば、 int fd = open(filename, O_WRONLY | O_APPEND | O_CREAT); のような使い方です。

masy0312
質問者

お礼

参考になりました。ありがとうございます!

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

画面の画素の色を表すのに RGBが使われます このRGB各要素が 8ビットのデータを扱うのにint型などが使われます このとき 上位16ビット中の下位8ビットにRed 下位16ビット中の上位8ビットが Green 下位16ビット中の下位8ビットが Blue と言った場合に各RGBのデータを抽出する際などにビット演算を使います int r = ( rgb & 0xFF0000 ) >> 16; int g = ( rgb & 0x00FF00 ) >> 8; int b = ( rgb & 0x0000FF ); // r g b に対して何らかの演算をする rgb = ( r << 16 ); rgb |= ( g << 8 ); rgb |= b; と言った具合で復元する

masy0312
質問者

お礼

画像処理の分野でビット演算を使用するという話を知人から以前 聞いたことがありました。 ご回答頂いた内容は非常に参考になりました。 ありがとうございます!

関連するQ&A

  • ビット演算子

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

  • C言語のビット演算子に関して

    はじめまして、今C言語の学習(半月ほど)を行っている者ですが ビット演算子のところで悩んでおります。 問題文に 変数cの2ビット目と3ビット目をONにする、 あるいはOFFにするといった表記がでてくるのですが このON、OFFとは何を意味しているのかいっこうにわかりません。 (私の考えではONとは1を意味しており2ビット目、3ビット目を ONにするとは -------------------------------------------------------------- ~1|1|0|0 (右から0ビット目、1ビット目、2ビット目、3ビット目) -------------------------------------------------------------- ということを言っているのではないだろうかと思っています。) ビットに関して私の勉強不足であることは十分に認識して おりますが、何かヒントをいただけるとありがたく思っています。 宜しくお願いいたします。

  • ビット演算で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を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • ビット演算について

    ビット演算ができないダメグラマーです。 10101010 C言語でバイト値の3ビット目の値が0の時は1に1の時は0(ビットを反転)にするにはどのように書くのでしょうか?

  • ビット演算を理解するための参考書を探してます

    ビット演算を理解するための参考書を探してます。 基本情報技術者の午後問題のC言語において、次のリンク先の問題のようにビットを使ったプログラム問題がさっぱり分かりません。 http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H10a2/pm07.html そこで、今までビット演算系の問題に触れていなかったためだと思い、 ビット演算のプログラムを扱った詳しい参考書を探しています。 基礎から上記URLの問題レベルまでの内容のものが特に良いです。 回答よろしくお願いします。

  • php と C# の ビット演算

    PHPでビット演算をしていますが、 PHPでたとえば、 c = a >> b でビット演算した値と、 C#で演算した値と aの値を大きくした場合、 4000000000以上? は結果が違ってきます。 C#とPHPではビット演算のアルゴリズムが違うのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ビット演算子

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

  • C言語での複素数の四則演算について

    C言語で、大きさ2の配列を2つ使って、複素数の四則演算のプログラムを作るのですが、配列をどう使うか分からず手が出せない状態です。 C言語を始めたばかりですので、基礎的なことしか分かりませんが、回答お願いします。

  • 論理演算、ビット演算

    C言語仕様上、真/偽は(Not0/0)であることは理解しています。また、処理順序から、論理演算とビット演算では評価対象の範囲が違うことも知っているつもりです。 その上で質問させていただきます。 お手数ですが、お解りになる方は教えていただけると助かります。 例えば、 i=0,j=0である場合 ( (i == 0) && (j == 0) )は真であると思いますが、 ( (i == 0) & (j == 0) )は規定されているでしょうか。 また、( (i == 0) | (j == 0) )は真となることが(理論上)保証されているように思えますが、問題ないでしょうか。 以上、よろしくお願いいたします。

  • ビット演算を学びたい

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

専門家に質問してみよう