Upgrade to Pro — share decks privately, control downloads, hide ads and more …

_美馬さん_入門_ビット演算.pdf

akatsukinewgrad
May 19, 2022
640

 _美馬さん_入門_ビット演算.pdf

akatsukinewgrad

May 19, 2022
Tweet

Transcript

  1. 入門 ビット演算
    Akatsuki Geek Live 2022 Vol.1
    2022/02/24
    task

    View full-size slide

  2. $ whoami
      Takashi Mima (task4233)
    👀 バックエンドとセキュリティ
      散歩とGo
      task4233.dev
     
    最近は何故かJavaばかり書いてます
    2

    View full-size slide

  3. 「入門 ビット演算」の目的
    ビット演算の初学者に対して、
    ・ビット演算とは何なのか
    ・ビット演算の利用例
    ・ビット演算のメリットとデメリット
    を提示すること
    補足
    ・使い慣れている方はコメントやマサカリをお願いします 󰢛
    ・説明には C++11 における演算子を用います
    3

    View full-size slide

  4. コンピュータはデータをビットの集合で表している
    ビット(0 or 1)
    ・0 と 1 の2通りの状態を表現できるデータの単位
    ・電圧の高低などで管理される

    ・単精度浮動小数点数(IEEE 754)は32ビットで1つの数値
    ・ASCIIコードは7ビットで1文字
    ・整数は利用ビット数に応じて範囲が変化する
    4

    View full-size slide

  5. ビット単位で行う演算がビット演算
    演算子 説明
    ~ (NOT) 値を反転する
    & (AND) 両方のビットが1ならば1、そうでなければ0
    | (OR) どちらか一方が1なら1、そうでなければ0
    ^ (XOR) どちらか一方のみが1なら1、そうでなければ0
    << (左シフト) 指定した数だけビット列を左にずらす
    >> (右シフト) 指定した数だけビット列を右にずらす
    5

    View full-size slide

  6. ビット演算の利用例
    組み込み・ゲームプログラミングでの状態管理
    ・条件を満たしている(いない)を簡潔に表現できる
    ・bool で宣言するよりもメモリが節約できることがある
    →詳しくは こちら
    集合の表現
    ・組み合わせを列挙できる
    ・ネットワークのサブネットマスクとしても利用されている
    →詳しくは こちら
    6

    View full-size slide

  7. ビット演算のメリットとデメリット
    メリット
    ・利用するデータ領域を削減できることがある
    ・実行する機械語命令が少ないので高速になることがある
    デメリット
    ・可読性が落ちる可能性がある
    ・意図しない挙動が起きる可能性がある
    7

    View full-size slide

  8. ビット演算のメリットとデメリット
    メリット
    ・利用するデータ領域を削減できることがある
    ・実行する機械語命令が少ないので高速になることがある
    デメリット
    ・可読性が落ちる可能性がある
    →コメントを書くことによって「なぜ」を提示する
    ・意図しない挙動が起きる可能性がある
    →ユニットテストで振る舞いを保証する
    8

    View full-size slide

  9. まとめ
    ビット演算は
    ・利用するデータ領域を削減できることがある
    ・実行する機械語命令が少ないので高速になることがある
    ただし
    ・意図を書かないと可読性が落ちる可能性がある
    ・意図しない挙動が起きる可能性がある
    メリット、デメリットを吟味して
    使ってみてください!
    ありがとうございました!
    9

    View full-size slide

  10. 時間が余ったらやる小ネタ
    10

    View full-size slide

  11. 2変数のみでのSwap
    void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
    }
    1
    void swap(int *a, int *b) {
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
    }

    View full-size slide

  12. 偶数ビットと奇数ビットのSwap
    ・各自のビットを抜き出してORでくっつけるイメージ
    int32_t swap_odd_and_even_bits(int32_t val) {
    return ((val & 0xaaaaaaaa) >> 1) | ((val & 0x55555555) << 1);
    }
    1

    View full-size slide

  13. マイナスを使わずに符号反転
    ・詳しくは2の補数でググろう
    void inverse_sign(int *val) {
    *val = ~*val | 1;
    }
    1

    View full-size slide

  14. 利用されるメモリ
    意外とバイト数を無駄に利用していることがある
    ・bool は 1Byte
    ・std::bitset は 環境依存
    ・boolに4バイトも利用している言語もある
    1

    View full-size slide