毎朝ちびちびCodewars。少し間が空きましたが、再開。
[7 kyu] Delta Bits www.codewars.com
今日のお題:
"""正の整数a, bを2進数表現したときに、ビット値が異なる桁の数を数える 取り得る a, bの上限は 216 とする。 例)a, b が 31, 14の場合 -> 0桁, 4桁 のビットが異なるから答えは 2 31 0 0 0 1 1 1 1 1 14 0 0 0 0 1 1 1 0 --- --------------- bit 7 6 5 4 3 2 1 0 """
コード
mine
def convert_bits(a, b): return format(a ^ b, 'b').count('1')
他の解き方
2進数の文字列化する方法2バリエーション。count()で数えるところは一緒。
def convert_bits(a, b): return f'{a^b:b}'.count('1')
def convert_bits(a,b): return bin(a^b).count(’1’)
文法、関数・メソッドnote
ビット演算子(論理積、論理和、排他的論理和、反転、シフト)まとめ
たまにしか使わないから忘れがち。
論理積(AND): & 演算子
論理和(OR): | 演算子
排他的論理和(XOR): ^ 演算子
ビット反転(NOT): ~ 演算子
ビットシフト: << / >> 演算子
負の整数の扱い
負の整数は、内部的には2の補数表現されたものとして扱われる。
bin(n)やformat(n, 'b')の出力結果は、絶対数にマイナス付きの形で表現される。
n = -1 print(bin(n)) # '-0b1' print(bin(n & 0xff)) # '0b11111111'
2の補数を求める方法
- 最上位ビット (MSB) よりひとつ上のビットが1で、残りが全て0であるような値(8ビットの整数であれば、 0b1 0000 0000( = 0x100) から、元の数nを引いた数で求まる: (0x100 - n)
- 1の補数に1を加える、と考える:(0xff - n) + 1
- 全桁1の値との&を取る
n = -1 bin(n & 0xff) # 0b11111111