Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตรวจสอบว่าบิตในช่วง L-R ของสองจำนวนเป็นคอมพลีเมนต์กันหรือไม่ ใน Python


ปัญหา

ให้จำนวน x, y และช่วงบิต left ถึง right (นับจากขวา เริ่ม 1) ตรวจสอบว่าบิตในช่วงนี้เป็นคอมพลีเมนต์กัน (0↔1) หรือไม่

ตัวอย่าง

x = 41 (101001₂), y = 54 (110110₂), left=2, right=5
บิต 2-5 ของ x: 1001, ของ y: 0110 → คอมพลีเมนต์กัน → True

ทฤษฎี

บิตคอมพลีเมนต์กัน ⟺ x XOR y มีบิต 1 ทั้งหมดในช่วงนั้น

โค้ดตัวอย่าง

def all_bits_set_in_range(n, left, right):
    # สร้างมาสก์บิต 1 ในช่วง left-right
    mask = ((1 << right) - 1) ^ ((1 << (left - 1)) - 1)
    return (n & mask) == mask

def solve(x, y, left, right):
    return all_bits_set_in_range(x ^ y, left, right)

print(solve(41, 54, 2, 5))  # True

อินพุต / เอาต์พุต

Input:  41, 54, 2, 5
Output: True