acokikoy's notes

最近気になる=[NoCode, Shopify], I am..=[Python, ウクレレ, マニュアル車, CMS] LoveなWebディレクター

毎朝Codewars@2019.07.18(木): Delta Bits

毎朝ちびちび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の補数を求める方法
  1. 最上位ビット (MSB) よりひとつ上のビットが1で、残りが全て0であるような値(8ビットの整数であれば、 0b1 0000 0000( = 0x100) から、元の数nを引いた数で求まる: (0x100 - n)
  2. 1の補数に1を加える、と考える:(0xff - n) + 1
  3. 全桁1の値との&を取る
n = -1
bin(n & 0xff)   # 0b11111111