クッキーもぐもぐ

PC関係とか映画とかゲームとかの

python。特定のビットの桁を判定、0や1にする方法

atcoder

B: 価格の合計 - AtCoder Beginner Contest 014 | AtCoder

をといたので復習に。

 

本当にメモ書きレベルなので誤字脱字多めです。

 

 

▲bit計算でフラブ管理が楽
・bitでフラグ管理が便利
・計算はそのまま&,|でおk
・数字はそのまま10進数か0b---
・注意:binとかformatはあくまで最終表示(str)
pythonだとformat(i,'b').zfill(n)で0bないし、桁数合わせられて便利(あくまで表示は)

・n桁目のフラグたってる?
if target & (1<<n-1):


if 10 & (1<<2) :
# 10は1010,(1<<2)は100
# 1010 と100の積は0000
#=右から3番めは0を判定している

・n桁目のフラグをon
target | (1<<n-1)


10 | (1<<2)
# 10は1010,(1<<2)は100
# 1010 と100の和は1110
# = 右から3番めを1にした


・n桁目のフラグをoff
target & ~(1<<n-1)


10 & ~(1<<3)
# 10は1010,(1<<3)は1000
# ~(1<<3)は0111
# 1010 と0111の積は0010
# = 右から4番めを0にした

 

参考までに

n,x =map(int,input().split())
a = list(map(int,input().split()))
allsum=0
for i,v in enumerate(a):
if x & (1<<i):#i番目のフラグが立っているかどうか #x(の2進数と)と100...0(1と0がi個)の論理積なのでi番目が0か1かわかる
allsum+=v#立っていた場合i番目の値vを足す

print(allsum)