2019年10月20日SHAREツイートシェアはてブLINEPocket基本的にC言語で扱うデータはバイト単位です。ビット単位で演算を行うビット演算(論理演算)自体使ったことがないという方も多いのではないかと思います。ビット単位でデータを管理したりビット演算を行うことでメリットもありますので、使いこなせるとより性能の高いプログラムを作ることもできます。このページではそのビット演算とC言語での使い方について解説します。調べる2進数表示する偶数・奇数を判定する2のべき乗の掛け算・割り算を行う2のべき乗の値の倍数かどうかを調べるまとめビット演算とはまずはビット演算がどのようなものであるかを、ビットとバイトの知識を踏まえて簡単に解説します。ビットとはビットとはコンピュータが扱うデータ量の最小単位です。表すことに用いられます。バイトとはバイトもデータ量の単位です。具体的には、ビットが8個集まったデータ量の単位であり、ビット1個で2つの状態を表すことができますので、1バイトでビットが8個で256の状態(2の8乗)を表現することができます。右のビットは第0ビット、一つ左隣は第1ビット、そのさらに左隣は第2ビット...、といった感じですね。値を扱うことができ、256個の状態を表現可能であることが分かると思います。型などは一般的に型のサイズはそれぞれ2バイトや4バイトであり、1バイトよりもさらに多くの状態を表現することが可能です。これらは結局全てビットという最小単位が集まって構成されているデータとなります。ビット演算とはそして、ビット演算とはビット単位で演算を行う処理のことを言います。基本的にプログラムで扱うのはバイト単位のデータで、ビットをあまり意識することはありません。ビット演算ではそのビットを意識し、バイトデータの中の特定のビットの値を変更する・特定のビットの値を取得する等の演算を行います。ビット単位で演算を行うことができれば、バイト単位ではなくビット単位でデータを管理することができるようになります。ビット演算のメリットではそのビット演算を行うことでどのようなメリットがあるでしょうか?ここについて解説していきたいと思います。使用メモリの削減まずメリットの一つはプログラム中で使用するメモリを削減することが可能であることです。具体例を示してこの効果を説明したいと思います。社員の資格試験合格状況を管理するデータ構造を考えてみましょう。ここでは下記の8つの資格試験合格状況を管理するとして説明します。)ST(ITストラテジスト試験)SA(システムアーキテクト試験)PM(プロジェクトマネージャ試験)NW(ネットワークスペシャリスト試験)DB(データベーススペシャリスト試験)ES(エンベデッドシステムスペシャリスト試験)このデータを管理するデータ構造としてどのようなものが思い浮かぶでしょうか?一番最初に思いつくのは下記のような構造体なのではないかと思います。8)のメモリが必要になります。一方で、ビット演算が使えれば、下のようにビット単位で資格試験の合格状況を管理することができます。表現するというわけです。構造体で管理する場合は一人あたり8バイトのメモリが必要ですが、この方法であれば一人あたり1バイトのメモリしか必要ありませんので7バイトのメモリを節約できているということになります。10000人であれば70000バイト(約70KB)の節約です。試験に合格しているかどうかを判断して処理するソースコードは下記のようになります。シフト演算子とも呼ばれます)。これらがどういう動きをするかは基本的なビット演算で解説します。この例からも分かるように、ビット単位で情報を管理し、それをビット演算で操作することができれば、使用メモリの削減をすることが可能です。プログラムの高速化もう一つのメリットとしてプログラムの処理速度を高速化可能であることが挙げられます。こちらも例を挙げて解説したいと思います。次のプログラムは0から10億までの整数が「8の倍数であるかどうか」をチェックするものになります。0;}最適化なしでコンパイルして実行すると、「約6.4秒」の時間がかかりました。0){下記のように変更することで各数字ば「8の倍数であるかどうか」を判断することができます(なぜこれで「8の倍数であるかどうか」を判断できるかは後述します)。0){変更後のソースコードを最適化なしでコンパイルして実行すると「約4.1秒」の時間で処理が完了し、高速化を行うことができています。コンピュータは基本的にビット演算が得意で処理が速いんですよね。ビット演算を用いることでプログラムの高速化することが可能です。MEMOちなみに高速化の最適化オプションをつけてコンパイルすると同じくらいの処理時間になりました。高速化の最適化オプションが常に付加できるとは限りませんので、特にこのオプションが付けられない時にビット演算が有効です。スポンサーリンク基本的なビット演算それではここからは、ここまで解説してきたビット演算をC言語で実際にどのように行うかを解説していきたいと思います。演算」「XOR演算」「左シフト演算」「右シフト演算」の6つになります。演算子を用いて実行することができます。格納されることになります。0;}表示結果は下記のようになります。二進数表記を明示的に表すための識別子です。定数の前にこれを付加することで、その定数を二進数として値を格納したり計算に用いたりすることができます。用いれば表示可能だが、二進数向けの指定子はない)。関数を自作しています。