Machine Morning

機械学習やWebについて学んだことを記録しています。

ビットフラグの判定

競プロの問題でビットフラグの判定の問題があった。

atcoder.jp

ビットフラグの判定は初見だったので各桁が0か1かを文字列から取り出して判定したが、他の人の解答を見るとどうも自分の書き方はスマートではない。

ということでスマートなビットフラグの判定方法を調べた。

各桁のビットが立っている(1)か立っていない(0)かの判定は

Pythonでは

for i in range(n):
   return (num >> i ) & 1

&演算子は論理演算のANDで、比較した両方のビットが1のときに1になる。& 1というのは000001(0は任意の数)との比較である。 すなわち右から2番め以降のビットは比較せずとも必ず0になるので、一番右のビットのみ判定が可能ということである。 ビットが立っていれば000001、立っていなければ000000になるので1 or 0の出力になり、右へのビットシフトを組み合わせることで各桁のビットの判定が可能ということである。

ちなみに私のabc014 B問題の解答は

n, x = map(int, input().split())
a = list(map(int, input().split()))

bx = bin(x)[::-1]
ans = 0

for i in range(n):
    if ((x >> i) & 1): ans += a[i]
    
print(ans)

とした。