पाठ 36 / 42

Bit Manipulation

मुख्य bitwise तरकीबें — bits की जांच, सेट और साफ़ करना — compact, तेज़ समाधान के लिए।

मुख्य operators

& (AND) bits जांचता है, | (OR) bits सेट करता है, ^ (XOR) bits toggle करता है, ~ सभी bits पलटता है, और <</>> bits shift करते हैं — 2 की घातों से गुणा/भाग। ये एक ही CPU cycle में चलते हैं, इसलिए bit trick बेहद तेज़ होते हैं।

आम recipes

Position i पर एक bit check/set/clear करें, और classic n & (n-1) trick जो सबसे कम set bit हटा देता है — set bits गिनने या 2 की घात जांचने में उपयोगी।

def get_bit(n, i):
    return (n >> i) & 1

def set_bit(n, i):
    return n | (1 << i)

def clear_bit(n, i):
    return n & ~(1 << i)

def count_set_bits(n):
    count = 0
    while n:
        n &= (n - 1)   # drops the lowest set bit
        count += 1
    return count

def is_power_of_two(n):
    return n > 0 and (n & (n - 1)) == 0

Output:

count_set_bits(11)      # 11 = 0b1011 -> 3
is_power_of_two(16)     # True

अकेला number खोजने के लिए XOR

XOR खुद का उलटा है: x ^ x = 0 और x ^ 0 = x। हर element को XOR करने से जोड़े कट जाते हैं, केवल अकेला value बचता है।

def single_number(nums):
    result = 0
    for x in nums:
        result ^= x
    return result

Output:

single_number([4, 1, 2, 1, 2])  # 4

जब bits काम आते हैं

DP में subsets दिखाने के लिए bitmasks इस्तेमाल करें (जैसे Travelling Salesman), visited states को compact रखें, या booleans के छोटे set को गति के लिए एक integer से बदलें।