以下の記事の続きです。
今回は、bit演算でn番目のbitを1にします。
簡略化のため、n番目は0から始まると考えます。
一番右側、つまり最下位の桁は0番目です。
論理和 (OR)演算
pythonでは、x | yと書くことで、x と y のビット単位 論理和を得ることができます。
| OR | 結果 |
|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
n番目のbitを1にする
1をnビット左シフトして、数字と|することで、n番目のbitを1にすることができます。
# 0番目のbitを1にする。
b2 b1 b0
0 0 0
1 << 0 0 0 1 |
--------
0 0 1
# 1番目のbitを1にする。
0 0 0
1 << 1 0 1 0 |
--------
0 1 0
# 2番目のbitを1にする。
0 0 0
1 << 2 1 0 0 |
--------
1 0 0
例えば、6(10)つまり110(2)、5(10)つまり101(2)、3(10)つまり011(2)のそれぞれ0の桁のbitを1に変更するには、以下のような操作で行うことができます。
1 << 0 0 0 1
6 : 1 1 0
0 0 1 |
-----
1 1 1
1 << 1 0 1 0
5 : 1 0 1
0 1 0 |
-----
1 1 1
1 << 2 1 0 0
3 : 0 1 1
1 0 0 |
-----
1 1 1
関数にまとめる
ここまでの操作を関数にまとめて、インタラクティブモードで実行してみます。
>>> def set_nth_bit(num: int, n: int): ... return num | (1 << n) ... >>> bin(set_nth_bit(6, 0)) '0b111' >>> bin(set_nth_bit(5, 1)) '0b111' >>> bin(set_nth_bit(3, 2)) '0b111' >>>
想定通りの結果を得ることができました。
以下に続きます。