モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

ビット演算 (C++をもう一度)

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2014/12/21
最終更新最終更新
2017/04/28
記事区分記事区分
一般公開

目次

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

    ビットフラグ

    #include <iostream>
    using namespace std;
    
    const int FLAG_A = 1; // 1 << 0
    const int FLAG_B = 2; // 1 << 1
    const int FLAG_C = 4; // 1 << 2
    const int FLAG_D = 8; // 1 << 3
    
    int main() {
        int flagsX = FLAG_A | FLAG_B | FLAG_C;
        int flagsY = FLAG_D;
        int flagsZ = 0;
    
        // AND(&): フラグの取り出し
        cout << (flagsX & FLAG_A) << endl; //=> 1
        cout << (flagsX & FLAG_B) << endl; //=> 2
        cout << (flagsX & FLAG_C) << endl; //=> 4
        cout << (flagsX & FLAG_D) << endl; //=> 0 ("== 0" であればフラグOFF)
    
        // OR(|): フラグの合成
        flagsY |= FLAG_A | FLAG_B; // A, B, D が ON
    
        // AND_NOT(&~): フラグの削除
        flagsY &= ~(FLAG_B | FLAG_D); // A が ON
    
        // XOR(^): フラグの反転
        flagsY ^= FLAG_A | FLAG_D; // D が ON
    
        return 0;
    }
    

    その他

    XORを用いて 0 と 1 のトグルが行えることは有名です。

    #include <iostream>
    using namespace std;
    
    int main() {
        int toggle = 1;
        toggle ^= 1;
        cout << toggle << endl; //=> 0
        toggle ^= 1;
        cout << toggle << endl; //=> 1
        //=> 0, 1, 0,...
    
        return 0;
    }
    

    左シフトは2のN乗倍、右シフトは2のN乗で割る。右シフトを扱うときは、負の数について先頭ビットが0と1のどちらで埋められるかが環境依存なため、unsignedを使用すると混乱を避けられます。

    #include <iostream>
    using namespace std;
    
    int main() {
        unsigned int x = 10;
        cout << (x << 3) << endl; //=> 80 (2**3 = 8倍)
        cout << (x >> 3) << endl; //=> 1 (10/8=1 (余り2は捨てる))
        return 0;
    }
    

    ビットの状態を出力する例は以下のようになります。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        unsigned int x = 10;
        vector<int> v;
    
        // ビット毎にスキャン
        for (int i = 1; i != 0; i <<= 1) {
            if((x & i) != 0) {
                v.push_back(1);
            }
            else {
                v.push_back(0);
            }
        }
    
        for (int i = v.size() - 1; i >= 0; --i) {
            cout << v[i];
        }
        cout << endl; //=> 00000000000000000000000000001010
        return 0;
    }
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    低レイヤーのプログラミングとOS開発が趣味。C言語を使っています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事