情報数学 I
第十回 (2011年12月 16日)
ブール代数とビット毎演算
Martin J. Dürst
http://www.sw.it.aoyama.ac.jp/2011/Math1/lecture10.html
© 2005-11 Martin
J. Dürst 青山学院大学
今週の予定
- これからの予定
- 先週の残りとまとめ
- ブール代数
- ビット毎演算
- 10進数以外の足し算
これからの予定
- 1月 6日 (金): 11回目の授業
- 1月13日 (金): 12回目の授業
- 1月18日 (水曜日1限、補講):
13回目の授業
- 1月20日 (金): 14回目の授業
- 1月21日~2月3日: 期末試験
補講についての注意
ブール代数
(boolean algebra)
- 論理演算、集合演算、半順序の「交差点」
- 論理演算、集合演算、一部の半順序の上位概念
- B = (B, 0, 1,
¬, ∧, ∨)
は次の条件でブール代数:
- 0 ∈ B, 1 ∈
B (1 は単位元、0
は零元と言う)
- ¬
はB上の単項演算、∧
と∨は二項演算
- ∧と∨について交換律、結合律と分配率が成立
- a ∈ B の場合に
a∨0 = a,
a∧1 = a
が成立
- a ∈ B の場合に
a∨¬a = 1,
a∧¬a = 0
が成立
- 公理はもっと少なめでよいが、複数の決め方が存在
- ブール代数は半順序、束の一種
- 注意: 0、1、∧
など太字のものは代表で、具体的の意味ではない
ブール代数の例 (1): 集合演算
- B は (有限) 集合 U
のベキ集合
- 0 は空集合
- 1 は U
- ¬ は補集合演算
- ∧ は積集合演算
- ∨ は和集合
- 半順序関係は ⊂ (部分集合)
ビット毎演算
ブール代数の例 (2): ビット毎論理演算
- B は すべての長さ n
のビット列の集合
- 0 は すべて 0 の長さ
n のビット列
- 1 は すべて 1 の長さ
n のビット列
- ¬ は ビット毎否定
- ∧ は ビット毎論理積
- ∨ は ビット毎論理和
- 半順序関係は ビット毎の順序の論理積
ブール代数の例 (3)
- B は
- 0 は
- 1 は
- ¬ は
- ∧ は
- ∨ は
- 半順序関係は
有限ブール代数の構造
- 有限ブール代数は全て |B| = 2n
である
- 有限ブール代数は全て同じ構造である (n
次元の立方体の辺)
(4次元の立方体の例)
- n のブール代数は全て同型 (isomorphic)
- ブール代数は全て同じ性質が成り立つ
(公理から証明可能)
ブール代数の例の同型
- 部分集合はビット列で表現可能
- 集合の演算は論理演算で表現可能
例: A ∪ B = { x | x ∈
A ∨ x ∈ B}
ビット毎演算の用途
- 集合の表現と演算
- 性質の記述とチェック
- データの細かい操作
(例えばデータ変換やデータ圧縮など)
データ型によって 8 ビット (1 バイト)、16 ビット、32
ビット、64 ビットを同時に実行
他のビット演算
- 左シフト:
- C 言語等で
<<
と書く。
b << n
では b
のビットをそれぞれ n
個左にずらし、右から 0 で埋める。左から n
個のビットは消える。
- オーバフローがない場合
b << n
は
b ×2n
- 右シフト:
- C 言語等で
>>
と書く。
b >> n
では b
のビットをそれぞれ n
個右にずらす。左から0で埋めるか最上位のビットを複写するのかはプログラム言語・データ型・実装による。右から
n 個のビットは消える。
- 左から 0 で埋める場合
b >> n
は
b / 2n
ビットごと演算の応用例
- ビット列 a でマスク m
のビットをセット:
a | m
- ビット列 a でマスク m
のビットを削除:
a & ~m
- ビット列 a でマスク m
のビットを逆転:
a ^ m
- ビット列 a で右から n
番目のビットをセット:
a | (1<<n)
(一番右が 0番目)
- ビット列 a で右から n 番目のビットを削除:
a & ~(1<<n)
(一番右が 0番目)
- ビット列 a で右から n 番目のビットを逆転:
a ^ (1<<n)
(一番右が 0番目)
その他にも多数の応用例 (Hacker's Delight, Henry S. Warren, Jr.,
Addison-Wesley, 2003 参照)
ビット毎演算で足し算
ビットごと演算だけでの足し算
- 入力 a=a0 と
b=b0 から「合計」(sum)
s0 = a0 ^
b0 と「繰越」(carry) c0 =
a0 & b0 を計算
- a1 = s0 と
b1 = c0 << 1
にし、計算をc が 0 になるまで繰り返す
- 実例: a0 = 1011101、b0 =
1101111