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

ビット演算の話 / Let's play with bit operations

kaityo256
September 26, 2024

ビット演算の話 / Let's play with bit operations

ビット演算の基礎と応用例の紹介

kaityo256

September 26, 2024
Tweet

More Decks by kaityo256

Other Decks in Programming

Transcript

  1. 3 37 真偽値とは 真(True)か偽(False)のどちらかの値をとる変数 Pythonの場合 多くのプログラム言語に真偽値を表現する型がある a = bool(1) print(a)

    # => True type(a) # => bool b = bool(0) print(b) # => False 整数の1をbool型に変換するとTrueに、0はFalseになる type(1 < 2) # => bool 比較結果はbool型になる (if文やwhile文などの条件分岐に使う)
  2. 4 37 論理演算 論理演算とは真偽値に関する演算のこと 否定 (NOT) 「真」の否定 → 偽 「偽」の否定

    → 真 print(not True) # => False print(not False) # => True 真偽値をひっくり返す Pythonコード例
  3. 5 37 論理演算 論理積 (AND) 「A and B」は「A かつ B」の意味

    AとBがどちらも真の時にのみ真、それ以外は偽 print(True and True) # => True print(True and False) # => False print(False and True) # => False print(False and False) # => False Pythonコード例
  4. 6 37 論理演算 論理和 (OR) 「A or B」は「A または B」の意味

    AとBのどちらかが真の時にのみ真、それ以外は偽 print(True or True) # => True print(True or False) # => True print(False or True) # => True print(False or False) # => False Pythonコード例 ※ 他にも否定論理積(NAND)や排他的論理和(XOR)などがある
  5. 9 37 ビット演算 論理積 (AND) 二つのビット列の共通部分を抜き出す 01100101 and 10110110 =

    00100100 二つのビット列の同じ桁にあるビットが両方とも1なら1、それ以外は0
  6. 10 37 ビット演算 論理和 (OR) 二つのビット列のどちらにもない場所を探す 01100101 or 10110110 =

    11110111 二つのビット列の同じ桁にあるビットが両方とも0なら0、それ以外は1
  7. 15 37 イラストロジックとビット演算 111100 and 011110 and 001111 = 001100

    塗るマスを1、塗らないマスを0とする 可能性を全て列挙し、論理積(AND)を取る 確定するマスの場所が高速に求められる
  8. 16 37 イラストロジックとビット演算 2,2 4 2 4 2,2 1 1

    2 2 3 3 2 2 1 1 横で確定マスを探したら、次は縦の探索をする 横の探索で確定したマス 次はここに着目 この辺にも確定マスはあるが 説明の都合で未確定とする
  9. 18 37 イラストロジックとビット演算 確定 マス 100000 2,2 and 110110 100000

    ANDをとったら確定マスと一致→無矛盾 A and B == A 自分と相手の論理積をとったものが自分と一致 →自分が完全に相手に含まれる 共通 部分
  10. 19 37 イラストロジックとビット演算 確定 マス 100000 2,2 and 011011 000000

    ANDをとって確定マスと一致しない→矛盾 A and B is not A 自分と相手の論理積をとったものが自分と一致しない →自分が完全に相手に含まれていない 共通 部分
  11. 20 37 イラストロジックとビット演算 確定 マス 110110 and 110011 = 110010

    確定マスと矛盾しない配置のみ列挙してANDをとる 新たな確定マスを得る
  12. 21 37 イラストロジックとビット演算 2,2 4 2 4 2,2 1 1

    2 2 3 3 2 2 1 1 同様な処理を縦・横を切り替えながら実行すると、(多分)絵が完成 ※ 空白確定マスの処理をやったかどうか記憶が曖昧・・・
  13. 22 37 数独 行、列、ボックスに1から9の数字が1つ ずつしか入らない 図の赤いところには1は入らない それぞれの数字について、どのマスに入る可能性があるかビットマスクを作成 g1 = 000000000000100111000000111010000001010000011000000000000000000011000110000000111

    g2 = 000000000000100111000010111100110001100110011000100101000000111000000000000000000 g3 = 001000010011000010000000000000000000110011000001001000101010000000000000100011000 g4 = 000110010000000000000011111000000000000111011000101101000110111000110110000000000 g5 = 000110000010101101100011101000000000000000000000101000100110101110110100100111101 g6 = 000000000001000111101000111000110001000110011000000000101110111101110110100110111 g7 = 000000000011101000101011000110111000110111000000000000101110001111110000100111001 g8 = 000000010000000000000000000000101000000000000000000000001100011001100010000101011 g9 = 000000000001101000101011000100111000100111010001101100000000000000110110000111110
  14. 23 37 数独 9本のビットマスクを縦に見て、一つしかビットが立っていなければ、 そのマスに入る数字はそれしかない→数字が確定 g1 = 000000000000 g2 =

    000000000000 g3 = 001000010011 g4 = 000110010000 g5 = 000110000010 g6 = 000000000001 g7 = 000000000011 g8 = 000000010000 g9 = 000000000001 マスの位置(本当は81ビット) 数字の1が、どのマスに 入る可能性があるか 9本のビットマスクについて、同じ桁に1つしかビットが立っていない 時に1となるようなビット演算を作りたい
  15. 24 37 気合で作った g1 = 000000000000 g2 = 000000000000 g3

    = 001000010011 g4 = 000110010000 g5 = 000110000010 g6 = 000000000001 g7 = 000000000011 g8 = 000000010000 g9 = 000000000001 b = 001000000000 考案したビット演算 9本のうち、同じ桁に1つしか立っていないビットを検出 (複数存在しても検出可能) マスの位置(本当は81ビット) このマスは3で確定 数字が確定したマスの位置
  16. 28 37 Directed Percolation active inactive active inactive 時間 向き(Direction)のあるパーコレーション(Percolation)

    各ボンドは確率pでアクティブ アクティブなサイトとアクティブなボンドで 下方向につながるサイトはアクティブ サイト ボンド
  17. 29 37 Directed Percolation 最初に「種」を置いておく p が小さい と絶滅 p が大きい

    と人口爆発 https://www.s.u-tokyo.ac.jp/ja/press/2016/4602/ 相転移 乱流遷移の普遍性と関係 [M. Sano and K. Tamai, Nat. Phys. 12, 249 (2016)] ←「乱流屏風」と呼ばれる実験装置
  18. 30 37 マルチスピンコーディング 0 1 1 0 1 0 1

    1 ・ メモリを効率的に利用できる ・ プログラムが高速化される (かもしれない) アクティブなサイトを1、そうでないサイトを0とする マルチスピンコーディングにより・・・ マルチスピンコーディングとは二種類の値を取る自由度を ビットでまとめて表現すること
  19. 33 37 マルチスピンコーディング アクティブなサイトを1-pの確率で殺すには 01101011 01110010 = 01100010 and 01110010

    1. 各ビットがランダムに確率pで1となるビット列を作る 2. サイト状態と論理積(AND)を取る 3. 確率pで生き残る(確率1-pで死ぬ)
  20. 38 37 以下補足資料 各ビットが独立に確率pで1、1-pで0となるような ランダムビット列を高速に作るアルゴリズム • Binomial-Shuffle 法 • Poisson-OR

    法 • 有限桁法と上記のハイブリッドアルゴリズム https://qiita.com/kaityo256/items/99efbe7ae9786d0f4351 解説記事 H. Watanabe, S. Morita, S. Todo, and N. Kawashima, J. Phys. Soc. Jpn. 88, 024004 (2019) 論文 公開ライブラリ https://github.com/kaityo256/rbs
  21. 40 37 Robert-Floyd's sampling algorithm N個の中からM個をランダムに選ぶアルゴリズム 乱数はM回しか振らなくて良い 1. J ←

    N-M+1 2. J個のなかからランダムに選ぶ 1. もし選ばれてないものを選んだら、そのまま選ぶ 2. もし選ばれていたらJ+1個を選ぶ 3. J ← J+1 4. J<Nなら 2.へ戻る N=8, M=3の例
  22. 43 37 Binomial-Shuffle (BS)法 立つビット数の計算に乱数を一回使う ビット数は二項分布 (Binomial-Distribution)に従う 平均乱数生成回数 1 +

    𝑝𝑁 ビット位置のシャッフル(Shuffle)に、ビット数 (平均pN)回の乱数を使う 確率pの試行をN回で何回成功するか?
  23. 44 37 Poisson-OR (PO) 法 1. 適切なパラメタλに従うポアソン分布でkを生成する 2. 1ビットだけランダムに立つビット列をk個用意する 3.

    それらすべての論理和(OR)を取る 01000000 00000010 00010000 01000000 01010010 or = k 確率pでビットが立つビット列完成 S. Todo and H. Suwa, J. Phys.: Conf. Ser. 473, 012013(2013)
  24. 47 37 有限桁法 良い乱数 = 各ビットが確率1/2で独立に1になっている 01010101001001110001000010101111 01001010011001111111100000111000 00011000001010011000001000111110 10011010010101010000101000110011

    00111010011101001111101100110011 メルセンヌ・ツイスタ法で作成した32ビット乱数列 つまり、 p= 0.5なら乱数一回で作ることができる
  25. 48 37 有限桁法 確率1/2でビットが立っているビット列 x1, x2 01010101 10011001 x1 x2

    01010101 10011001 00010001 x1 and x2 and = 01010101 10011001 11011101 x1 or x2 or = 確率1/4のビット列 確率3/4のビット列 1/4 = (0.01)B 3/4 = (0.11)B
  26. 49 37 有限桁法 1/2 = (0.1)B 1/4 = (0.01)B 3/4

    = (0.11)B 5/8 = (0.101)B n個の乱数で二進数表記n桁の確率を表現できる x1 x2 AND x1 x2 OR x1 x3 OR (x2 AND x1) 論理式の作り方: pを二進数表記して、右から「1ならAND」「0ならOR」 (0.0101)B = 5/16 3 2 1 x4 AND (x3 OR (x2 AND x1))
  27. 50 37 ハイブリッド法 p = 0.51のビット列が欲しい時 1. 有限桁法で p =

    0.5のビット列を作る 2. BS法かPO法でp=0.02のビット列を作る 3. 二つのビット列のORを取る 1 - p =(1-0.5)(1-0.02) ORは「どちらも0なら0」 できたビット列の0の確率 二つとも0の確率 p = 0.51
  28. 52 37 ハイブリッド法の地図 平 均 乱 数 生 成 回

    数 p = 1/4 からの補正 p = 3/8 からの補正 32ビットなら高々7回の乱数生成で 任意の確率のビット列を生成可能 欲しい確率p