トップページ -> AOJの解答例 -> ITP2_10の解答例

ITP2_10の解答例(Python)

ビット演算に関する問題です.ビット演算子を使います.以下のサイトでPythonのビット演算子について詳しく説明されています.
【外部サイト】Pythonのビット演算子

1. ITP2_10_A: Bit Operation I

ビットの反転,左シフト,右シフトを行います. 0xffffffff は 2進数に直すと2が32個並ぶ数字です.

# ITP2_10_A
x = int(input())

print(format(x & 0xffffffff, '032b')) # ビット列
print(format(~x & 0xffffffff, '032b')) # 反転
print(format((x<<1) & 0xffffffff, '032b')) # 左シフト
print(format((x>>1) & 0xffffffff, '032b')) # 右シフト

2. ITP2_10_B: Bit Operation II

2つのビット列に対してAND, OR, XORを求める問題です.

# ITP2_10_B
a,b = list(map(int,input().split(" ")))

print(format(a & b & 0xffffffff, '032b')) # AND
print(format(a | b & 0xffffffff, '032b')) # OR
print(format(a ^ b & 0xffffffff, '032b')) # XOR

3. ITP2_10_C: Bit Flag

クエリに対応する9通りの操作を行う問題です. それぞれの処理がOR, AND, XORを使ってどのように表現できるかを考えます.

# ITP2_10_C

# n桁目のみフラグが立っているものとの AND を考える
def bit_test(bit_flag,n):
    if bit_flag & 1<<n:
        return 1
    else:
        return 0
    
# n桁目のみフラグが立っているものとの OR を考える
def bit_set(bit_flag,n):
    return bit_flag | 1<<n

# n桁目のみフラグが立っていないものとの AND を考える
def bit_clear(bit_flag,n):
    return bit_flag & ((1<<n) ^ MAX)

# n桁目のみフラグが立っているものとの XOR を考える
def bit_flip(bit_flag,n):
    return bit_flag ^ (1<<n)

# MAXと一致するかを調べる
def bit_all(bit_flag):
    return int(bit_flag == MAX)

# 0でないかを調べる
def bit_any(bit_flag):
    return int(bit_flag != 0)

# 0でないかを調べる
def bit_none(bit_flag):
    return int(bit_flag == 0)

def bit_count(bit_flag):
    return bin(bit_flag).count("1")

MAX = 0xffffffffffffffff

bit_flag = 0

n = int(input())
for _ in range(n):
    query = list(map(int,input().split(" ")))
    if query[0] == 0:
        print(bit_test(bit_flag,query[1]))
    elif query[0] == 1:
        bit_flag = bit_set(bit_flag,query[1])
    elif query[0] == 2:
        bit_flag = bit_clear(bit_flag,query[1])
    elif query[0] == 3:
        bit_flag = bit_flip(bit_flag,query[1])
    elif query[0] == 4:
        print(bit_all(bit_flag))
    elif query[0] == 5:
        print(bit_any(bit_flag))
    elif query[0] == 6:
        print(bit_none(bit_flag))
    elif query[0] == 7:
        print(bit_count(bit_flag))
    else:
        print(bit_flag)

4. ITP2_10_D: Bit Mask

Cの操作を与えられたビットマスクを使って行います. Cの「n桁目のみフラグが立っているもの」をビットマスクに置き換えました.

# ITP2_10_D

# n桁目のみフラグが立っているものとの AND を考える
def bit_test(bit_flag,n):
    if bit_flag & 1<<n:
        return 1
    else:
        return 0
    
# マスクとの OR を考える
def bit_set(bit_flag,mask):
    return bit_flag | mask

# マスクを反転させたものとの AND を考える
def bit_clear(bit_flag,mask):
    return bit_flag & (mask ^ MAX)

# n桁目のみフラグが立っているものとの XOR を考える
def bit_flip(bit_flag,mask):
    return bit_flag ^ mask

# bit_flag と mask のAND が mask と一致すればよい
def bit_all(bit_flag,mask):
    return int((bit_flag & mask) == mask)

# bit_flag と mask の AND が0でないかを調べる
def bit_any(bit_flag,mask):
    return int((bit_flag & mask) != 0)

# bit_flag と mask の AND が0でないかを調べる
def bit_none(bit_flag,mask):
    return int((bit_flag & mask) == 0)

# bit_flag と mask の AND に対してカウントする
def bit_count(bit_flag,mask):
    return bin(bit_flag & mask).count("1")

# bit_flag と mask の AND を返す
def bit_val(bit_flag,mask):
    return bit_flag & mask

MAX = 0xffffffffffffffff

bit_flag = 0

# mask を作ってリストで管理する
mask_list = []
n = int(input())
for _ in range(n):
    bit_string = list(map(int,input().split(" ")))[1:]
    mask = 0
    for b in bit_string:
        mask += 2**b
        
    mask_list.append(mask)

n = int(input())
for _ in range(n):
    query = list(map(int,input().split(" ")))
    if query[0] == 0:
        print(bit_test(bit_flag,query[1]))
    else:
        mask = mask_list[query[1]]
        if query[0] == 1:
            bit_flag = bit_set(bit_flag,mask)
        elif query[0] == 2:
            bit_flag = bit_clear(bit_flag,mask)
        elif query[0] == 3:
            bit_flag = bit_flip(bit_flag,mask)
        elif query[0] == 4:
            print(bit_all(bit_flag,mask))
        elif query[0] == 5:
            print(bit_any(bit_flag,mask))
        elif query[0] == 6:
            print(bit_none(bit_flag,mask))
        elif query[0] == 7:
            print(bit_count(bit_flag,mask))
        else:
            print(bit_val(bit_flag,mask))

<- 前へ戻る 【目次に戻る】 次へ進む ->