0Pricing
Coding Interview Prep · บทเรียน

การนับบิต จำนวนที่หายไป และการกลับบิต

คำนวณจำนวนบิตของ 0..n ด้วย DP และเทคนิคบิตที่ตั้งค่าต่ำสุด ค้นหาจำนวนที่หายไปด้วย XOR และกลับลำดับบิตของจำนวนเต็ม 32 บิต

การนับบิต จำนวนที่หายไป และการกลับบิต เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมปัญหาการนับบิต

ปัญหา การนับบิต (LeetCode 338) ถามว่า เมื่อกำหนด n ให้คืนค่าอาร์เรย์ ans ขนาด n+1 โดยที่ ans[i] คือจำนวนบิต 1 ใน i วิธีตรงไปตรงมาใช้เวลา O(n log n) โดยนับบิตของแต่ละจำนวนแยกกัน วิธี DP ใช้เวลา O(n) โดยอาศัยความสัมพันธ์ระหว่าง i กับครึ่งหนึ่งของมันหรือบิต 1 ที่อยู่ขวาสุด

ข้อสังเกตสำคัญสองประการเป็นพื้นฐานของ DP: (1) i >> 1 จะตัดบิตต่ำสุดออก ดังนั้น bits[i] = bits[i >> 1] + (i & 1) (2) การล้างบิต 1 ที่อยู่ขวาสุด: bits[i] = bits[i & (i-1)] + 1 ทั้งสองวิธีใช้เวลา O(n) และพื้นที่ O(n) (สำหรับอาร์เรย์ผลลัพธ์)

def count_bits_v1(n):
    # O(n log n): naive individual count
    return [bin(i).count('1') for i in range(n + 1)]

def count_bits_dp(n):
    # O(n): DP using right shift
    dp = [0] * (n + 1)
    for i in range(1, n + 1):
        dp[i] = dp[i >> 1] + (i & 1)   # i >> 1 drops last bit
    return dp

def count_bits_dp2(n):
    # O(n): DP using lowest-set-bit trick
    dp = [0] * (n + 1)
    for i in range(1, n + 1):
        dp[i] = dp[i & (i - 1)] + 1   # i & (i-1) clears lowest set bit
    return dp

n = 10
print('Naive:', count_bits_v1(n))
print('DP v1:', count_bits_dp(n))
print('DP v2:', count_bits_dp2(n))

เหตุผลที่สมการเวียนเกิดของ DP ใช้งานได้

สำหรับ สมการเวียนเกิดแบบเลื่อนไปทางขวา dp[i] = dp[i >> 1] + (i & 1): การหารด้วย 2 (การเลื่อนไปทางขวา) จะลบบิตสุดท้ายออก หากบิตสุดท้ายเป็น 1 จำนวนจะเพิ่มขึ้น 1 หากเป็น 0 จำนวนจะไม่เปลี่ยนแปลง ดังนั้น bits[i] = bits[i // 2] + (i mod 2)

สำหรับ สมการเวียนเกิดของบิต 1 ที่อยู่ขวาสุด dp[i] = dp[i & (i-1)] + 1: i & (i-1) จะล้างบิต 1 ที่อยู่ขวาสุดออก จึงมีบิตที่ตั้งค่าไว้น้อยกว่า i อยู่หนึ่งบิต ดังนั้นจำนวนบิตจึงเท่ากับจำนวนของค่าที่ลดลงนั้นบวก 1 สมการเวียนเกิดทั้งสองแบบประมวลผล i จากน้อยไปมาก จึงแก้ปัญหาย่อยที่เล็กกว่าได้ก่อนเสมอ

# Trace both recurrences for i = 0..8
print('i | i>>1 | i&1 | dp[i>>1]+(i&1) | i&(i-1) | 1+dp[i&(i-1)]')
print('-' * 60)
dp = [0] * 9
for i in range(1, 9):
    # Right shift method
    v1 = dp[i >> 1] + (i & 1)
    # Lowest set bit method
    v2 = dp[i & (i - 1)] + 1
    dp[i] = v1   # either works
    print(f'{i:2d} ({bin(i)[2:]:4s}) | {i>>1:2d} | {i&1} | {v1}               | {i&(i-1):2d}      | {v2}')
print('\nFinal dp:', dp)

จำนวนที่หายไป: วิธี XOR และผลรวม

ปัญหา จำนวนที่หายไป (LeetCode 268) กำหนดอาร์เรย์ของจำนวน n จำนวนที่แตกต่างกันในช่วง [0, n] โดยมีจำนวนหนึ่งค่าที่หายไป วิธี XOR: ทำ XOR ดัชนีทั้งหมดตั้งแต่ 0 ถึง n กับค่าทั้งหมดในอาร์เรย์ ค่าที่จับคู่กันจะหักล้างกัน เหลือเป็นจำนวนที่หายไป วิธี ผลรวม: expected = n*(n+1)//2 แล้วคืนค่า expected - sum(nums)

ทั้งสองวิธีใช้เวลา O(n) และพื้นที่ O(1) วิธี XOR มีความทนทานมากกว่าในภาษาที่ใช้จำนวนเต็มความกว้างคงที่ เพราะหลีกเลี่ยงค่าล้นที่อาจเกิดขึ้นได้ ใน Python ทั้งสองวิธีทำงานได้ดี เนื่องจากจำนวนเต็มรองรับความแม่นยำตามต้องการ

def missing_xor(nums):
    n = len(nums)
    result = n
    for i, val in enumerate(nums):
        result ^= i ^ val   # each index i cancels its matching value
    return result

def missing_sum(nums):
    n = len(nums)
    return n * (n + 1) // 2 - sum(nums)

test_cases = [
    [3, 0, 1],           # missing 2
    [0, 1],              # missing 2
    [9,6,4,2,3,5,7,0,1], # missing 8
    [0],                 # missing 1
]
for nums in test_cases:
    print(f'{nums} => XOR={missing_xor(nums)}, Sum={missing_sum(nums)}')

การกลับลำดับบิตของจำนวนเต็ม 32 บิต

ปัญหา การกลับลำดับบิต (LeetCode 190) ให้คุณกลับลำดับการแทนค่าเลขฐานสองของจำนวนเต็มไม่มีเครื่องหมายขนาด 32 บิต วิธีวนซ้ำคือประมวลผลบิตทั้ง 32 บิตจากขวาไปซ้ายในข้อมูลเข้า แล้ววางบิตเหล่านั้นจากซ้ายไปขวาในผลลัพธ์ ในแต่ละรอบ ให้ดึงบิตขวาสุดด้วย n & 1 เลื่อนผลลัพธ์ไปทางซ้ายเพื่อเว้นที่ ใช้ OR ใส่บิตนั้น แล้วเลื่อน n ไปทางขวา

หลังจากทำครบ 32 รอบ จำนวนเต็มผลลัพธ์จะมีบิตทั้ง 32 บิตของ n ในลำดับกลับด้าน การดำเนินการนี้ใช้เวลา O(32) = O(1) ต่อการเรียกหนึ่งครั้ง หรือใช้เวลาแบบตัดจำหน่าย O(1) เมื่อเก็บผลลัพธ์ไว้ในแคชสำหรับการเรียกซ้ำที่แบ่งข้อมูลเป็นช่วงละ 8 บิต

def reverse_bits(n):
    result = 0
    for _ in range(32):
        result = (result << 1) | (n & 1)  # shift result left, OR in rightmost bit
        n >>= 1                            # move to next bit
    return result

# Test with known values
print(reverse_bits(0b00000010100101000001111010011100))  # 964176192
print(reverse_bits(0b11111111111111111111111111111101))  # 3221225471
print(reverse_bits(0))   # 0
print(reverse_bits(1))   # 2147483648 (bit 0 goes to bit 31)
print(reverse_bits(0b10000000000000000000000000000000))  # 1

การกลับบิต: แบ่งแล้วพิชิต

วิธีที่เร็วกว่า O(log 32) = O(1) จะกลับลำดับบิตด้วย การสลับแบบแบ่งแล้วพิชิต ขั้นแรกสลับบิตที่อยู่ติดกัน จากนั้นสลับกลุ่มขนาด 2 บิตที่อยู่ติดกัน แล้วจึงสลับกลุ่มขนาด 4 บิต และทำต่อไปในลักษณะเดียวกัน การสลับแต่ละระดับใช้มาสก์เพื่อแยกกลุ่มที่สลับกัน และใช้การเลื่อนเพื่อสอดแทรกกลุ่มเหล่านั้น หลังจากสลับ 5 ครั้ง บิตทั้ง 32 บิตจะกลับลำดับอย่างสมบูรณ์

วิธีนี้ใช้จำนวนการดำเนินการคงที่ O(1) ไม่ว่าข้อมูลเข้าจะเป็นอะไร และใช้ในการนำไปใช้งานบนฮาร์ดแวร์ มาสก์เป็นค่าคงที่ ได้แก่ 0x55555555 (รูปแบบ 01 สลับกัน) 0x33333333 (รูปแบบ 0011 สลับกัน) 0x0f0f0f0f (รูปแบบ 00001111 สลับกัน) และอื่น ๆ

def reverse_bits_dc(n):
    # Treat n as 32-bit unsigned
    n &= 0xFFFFFFFF
    # Swap adjacent bits
    n = ((n & 0x55555555) << 1)  | ((n >> 1)  & 0x55555555)
    # Swap adjacent 2-bit groups
    n = ((n & 0x33333333) << 2)  | ((n >> 2)  & 0x33333333)
    # Swap adjacent 4-bit groups
    n = ((n & 0x0f0f0f0f) << 4)  | ((n >> 4)  & 0x0f0f0f0f)
    # Swap adjacent bytes
    n = ((n & 0x00ff00ff) << 8)  | ((n >> 8)  & 0x00ff00ff)
    # Swap adjacent 16-bit halves
    n = ((n & 0x0000ffff) << 16) | ((n >> 16) & 0x0000ffff)
    return n & 0xFFFFFFFF

# Verify against iterative version
def reverse_bits_iter(n):
    result = 0
    for _ in range(32):
        result = (result << 1) | (n & 1); n >>= 1
    return result

for test in [0b10110100, 0b11111111, 0, 1, 0xDEADBEEF]:
    assert reverse_bits_dc(test) == reverse_bits_iter(test)
    print(f'{test:#010x} reversed: {reverse_bits_dc(test):#010x}')

จำนวนบิต 1 (น้ำหนักแฮมมิง)

ปัญหา จำนวนบิต 1 (LeetCode 191) ขอให้หาน้ำหนักแฮมมิง (การนับบิต 1) ของจำนวนเต็มไม่มีเครื่องหมาย มีสามวิธีที่มีข้อแลกเปลี่ยนแตกต่างกัน ได้แก่ ลูปแบบตรงไปตรงมา (O(32)) วิธีของ Brian Kernighan (O(k) โดยที่ k = จำนวนบิตที่ตั้งค่าไว้) และ n.bit_count() ในตัวของ Python (3.10 ขึ้นไป)

วิธีของ Brian Kernighan เป็นวิธีที่ควรเลือกในการสัมภาษณ์ เพราะแสดงให้เห็นความเข้าใจเทคนิค n & (n-1) ในแต่ละรอบจะลบบิต 1 ที่อยู่ขวาสุดออก ดังนั้นลูปจะทำงานจำนวนครั้งเท่ากับจำนวนบิต 1 พอดี ซึ่งเร็วกว่าการตรวจสอบครบทั้ง 32 บิตมากสำหรับจำนวนเต็มที่มีบิต 1 อยู่เบาบาง

def hamming_weight_naive(n):
    count = 0
    while n:
        count += n & 1
        n >>= 1
    return count

def hamming_weight_kernighan(n):
    count = 0
    while n:
        n &= n - 1   # clear lowest set bit
        count += 1
    return count

# Python 3.10+
# def hamming_weight_builtin(n): return n.bit_count()

for n in [0, 1, 11, 128, 255, 0xDEADBEEF]:
    naive = hamming_weight_naive(n)
    kern  = hamming_weight_kernighan(n)
    bits  = bin(n).count('1')
    print(f'{n:#012b} ({n:10d}): naive={naive}, kern={kern}, bin={bits}')

ผลรวมบิตต่อเนื่อง: วิธีใช้คำนำหน้า

บางครั้งคุณต้องนับบิต 1 ในช่วง [l, r] อย่างรวดเร็ว ให้สร้าง ผลรวมสะสมของบิตที่ตั้งค่าไว้ สำหรับช่วง 0..n: prefix[i] = prefix[i-1] + bin(i).count('1') จากนั้นจำนวนบิตในช่วง [l, r] คือ prefix[r] - prefix[l-1] วิธีนี้ทำให้สอบถามช่วงได้ในเวลา O(1) หลังจากประมวลผลล่วงหน้าในเวลา O(n)

แนวคิดนี้ขยายใช้กับค่ารวมที่อาศัยบิตในช่วงใด ๆ ได้ ตัวอย่างเช่น การนับจำนวนใน [l, r] ที่มีจำนวนบิต 1 เป็นจำนวนคู่ ใช้เทคนิคผลรวมสะสมแบบเดียวกัน แต่เปลี่ยนฟังก์ชันที่ใช้สะสม

def build_bit_prefix(n):
    prefix = [0] * (n + 2)
    for i in range(1, n + 1):
        prefix[i] = prefix[i - 1] + bin(i).count('1')
    return prefix

def count_bits_range(prefix, l, r):
    return prefix[r] - prefix[l - 1]

# Build prefix for 0..15
prefix = build_bit_prefix(15)
print('Prefix sums (set bit counts up to i):')
for i in range(16):
    print(f'  i={i:2d} ({bin(i)[2:]:4s}): bits={bin(i).count("1")}, prefix={prefix[i]}')

# Range queries
print(f'\nSet bits in [5, 10]: {count_bits_range(prefix, 5, 10)}')
print(f'Set bits in [1, 15]: {count_bits_range(prefix, 1, 15)}')

การกลับลำดับบิตสำหรับจำนวนติดลบ

ใน Python จำนวนเต็มมีเครื่องหมายและมีความกว้างได้ตามต้องการ เมื่อกลับลำดับบิตสำหรับโจทย์ของ LeetCode เราต้องถือว่าข้อมูลเข้าเป็น จำนวนเต็มไม่มีเครื่องหมายขนาด 32 บิต ให้ทำมาสก์ข้อมูลเข้าด้วย & 0xFFFFFFFF ก่อนประมวลผล เพื่อให้แน่ใจว่าพิจารณาเฉพาะ 32 บิตเท่านั้น ผลลัพธ์ควรเป็นจำนวนเต็มไม่มีเครื่องหมายขนาด 32 บิตเช่นกัน หรือเป็นจำนวนที่ไม่ติดลบ

หากคุณได้รับจำนวนเต็มของ Python ที่อาจเป็นค่าติดลบในความหมายแบบส่วนเติมเต็มสอง ให้ใช้ & 0xFFFFFFFF ก่อนเพื่อแปลงเป็นตัวแทนจำนวนเต็มไม่มีเครื่องหมายขนาด 32 บิต แล้วจึงกลับลำดับบิต ผลลัพธ์จะเป็นจำนวนที่ไม่ติดลบเสมอ และอยู่ระหว่าง 0 ถึง 2^32 - 1

def reverse_bits_signed_safe(n):
    n &= 0xFFFFFFFF   # treat as 32-bit unsigned
    result = 0
    for _ in range(32):
        result = (result << 1) | (n & 1)
        n >>= 1
    return result & 0xFFFFFFFF

# Python treats -1 as all 1s in two's complement
print(f'-1 as 32-bit unsigned: {-1 & 0xFFFFFFFF:#010x}')  # 0xffffffff
print(f'Reversed: {reverse_bits_signed_safe(-1):#010x}')   # 0xffffffff (all 1s reversed = all 1s)

# -2 in 32-bit = 0xFFFFFFFE = 11...10
print(f'-2 as 32-bit unsigned: {-2 & 0xFFFFFFFF:#010x}')  # 0xfffffffe
print(f'Reversed: {reverse_bits_signed_safe(-2):#010x}')   # 0x7fffffff

DP การจัดการบิต: รูปแบบการนับบิต

ปัญหาการนับบิตเผยให้เห็นรูปแบบทั่วไปของ DP สำหรับบิต: หากทราบคำตอบของ i ในรูปแบบที่เล็กกว่า ก็สามารถคำนวณคำตอบของ i ได้ด้วยการดำเนินการบิตที่ใช้เวลาคงที่ รูปแบบนี้ขยายใช้กับปัญหาการนับบิตอื่น ๆ ได้ เช่น การนับจำนวนที่มีบิตที่ตั้งค่าไว้ตรง k บิตในช่วง [0, n] (ใช้การแจกแจงแบบเลขฐานสอง) หรือการหากำลังของสองที่สูงสุดซึ่งหารแต่ละจำนวนลงตัว

ข้อสังเกตที่มีประโยชน์อีกประการคือ จำนวนบิตที่ตั้งค่าไว้ของ i เป็นไปตามรูปแบบที่ซ้ำกันภายในแต่ละช่วงกำลังของสอง รูปแบบสำหรับ [2^k, 2^(k+1) - 1] เหมือนกับรูปแบบสำหรับ [0, 2^k - 1] โดยเพิ่มค่าแต่ละค่าอีก 1 เนื่องจากบิต k ถูกตั้งค่าไว้เสมอในช่วงนี้

# Visualise the repeating pattern
def show_bit_pattern(n):
    bits = [bin(i).count('1') for i in range(n + 1)]
    print('i  | bits | pattern')
    for i, b in enumerate(bits):
        block = i.bit_length() - 1 if i > 0 else 0
        print(f'{i:2d} ({bin(i)[2:]:4s}) | {b} | block {block}')
    return bits

bits = show_bit_pattern(15)
# Verify the pattern: bits[i] = bits[i - highest_power] + 1 for i >= 2^k
print('\nVerify pattern:')
for i in range(1, 16):
    highest_pow = 1 << (i.bit_length() - 1)
    if highest_pow < i:
        prev_i = i - highest_pow
        print(f'bits[{i}] = bits[{prev_i}] + 1 = {bits[prev_i]} + 1 = {bits[i]}')

รวมทั้งสามแนวคิด: แบบฝึกหัดบูรณาการ

โจทย์สัมภาษณ์จำนวนมากผสานการนับบิต ตรรกะเกี่ยวกับจำนวนที่หายไป และการกลับลำดับบิตไว้ในคำถามเดียว ตัวอย่างเช่น กำหนดอาร์เรย์ที่สมาชิกเป็นจำนวนเต็มขนาด n บิตและมีสมาชิกหนึ่งตัวหายไป ให้ค้นหาค่าที่หายไป หรือกำหนดกระแสข้อมูลจำนวนบิต ให้สร้างจำนวนเต็มที่หายไปกลับคืนมา โจทย์เหล่านี้ต้องอาศัยการจดจำว่าควรใช้เทคนิคย่อยใด

ฝึกสร้างแผนผังความคิด: หากโจทย์พูดถึงการค้นหาองค์ประกอบที่หายไป ให้คิดถึง XOR หรือผลรวม หากระบุว่า “นับบิต 1 อย่างมีประสิทธิภาพ” ให้คิดถึงวิธีของ Kernighan หรือ DP หากระบุว่า “กลับลำดับบิต” ให้คิดถึงวิธีวนซ้ำหรือวิธีแบ่งแล้วพิชิต ทั้งสามอย่างนี้คือเครื่องมือหลักของการจัดการบิตในการสัมภาษณ์

# Integrated exercise: given bit-count array, find the missing number
# arr[i] = number of 1 bits in i, for all i in 0..n except one
# Reconstruct the missing number

def find_missing_from_bit_counts(bit_counts, n):
    # Rebuild full count array
    full = [bin(i).count('1') for i in range(n + 1)]
    # Find which index is missing by comparing
    for i, count in enumerate(bit_counts):
        if full[i] != count:
            return i - 1  # the entry before the mismatch is missing
    return n  # last element missing

# Simpler: use XOR on indices matching bit counts
# (This is simplified for illustration)
bits = [0,1,1,2,1,2,2,3,0,1]  # bit counts for 0..9 with 8 missing
# Normal: [0,1,1,2,1,2,2,3,1,2]
# Missing is index 8
full = [bin(i).count('1') for i in range(10)]
missing_idx = None
for i in range(10):
    if i >= len(bits) or bits[i] != full[i]:
        missing_idx = i
        break
print(f'Missing number: {missing_idx}')

การเก็บบิตไว้ในแคชสำหรับการกลับลำดับบิต

สำหรับการเรียกกลับลำดับบิตซ้ำ ๆ (เช่น ในการจำลองฮาร์ดแวร์) ให้เก็บผลลัพธ์ของข้อมูลช่วงละ 8 บิตไว้ในแคช เนื่องจากแต่ละไบต์มีค่าได้เพียง 256 ค่า จึงคำนวณล่วงหน้าค่าไบต์ที่กลับลำดับแล้วสำหรับทุกค่าตั้งแต่ 0 ถึง 255 หากต้องการกลับลำดับจำนวนเต็มขนาด 32 บิต ให้แบ่งเป็นช่วงขนาด 8 บิตสี่ช่วง กลับลำดับแต่ละช่วง แล้วประกอบกลับตามลำดับย้อนกลับ

วิธีนี้ลดการเรียกแต่ละครั้งเหลือการค้นหาจากตารางสี่ครั้งและการดำเนินการบิต จึงเร็วกว่าลูป 32 รอบมากเมื่อประมวลผลข้อมูลจำนวนมาก แคชจะถูกสร้างขึ้นครั้งเดียวโดยใช้เวลา O(256 × 8) และนำกลับมาใช้กับการเรียกครั้งถัดไปทั้งหมดในเวลา O(1)

# Build 8-bit reverse cache
def build_reverse_byte_cache():
    cache = [0] * 256
    for i in range(256):
        n, result = i, 0
        for _ in range(8):
            result = (result << 1) | (n & 1)
            n >>= 1
        cache[i] = result
    return cache

cache = build_reverse_byte_cache()

def reverse_bits_cached(n):
    return (cache[n & 0xFF] << 24 |
            cache[(n >> 8) & 0xFF] << 16 |
            cache[(n >> 16) & 0xFF] << 8 |
            cache[(n >> 24) & 0xFF])

# Test
for test in [0b10110100, 0b11111111, 0x12345678]:
    cached  = reverse_bits_cached(test)
    # Reference: iterative
    n, result = test, 0
    for _ in range(32): result = (result << 1) | (n & 1); n >>= 1
    assert cached == result
    print(f'{test:#010x} => {cached:#010x}')

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจแนวคิดโครงสร้างข้อมูลและอัลกอริทึม — การเตรียมตัวสำหรับการสัมภาษณ์การเขียนโปรแกรมจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า การนับบิตใช้ DP โดยใช้ dp[i] = dp[i >> 1] + (i & 1) หรือ dp[i] = dp[i & (i-1)] + 1 เพื่อให้ใช้เวลา O(n) จำนวนที่หายไปแก้ได้ในเวลา O(n) และพื้นที่ O(1) โดยทำ XOR ดัชนีทั้งหมดกับค่าทั้งหมด หรือใช้สูตรผลรวมทางคณิตศาสตร์ และ การกลับลำดับบิต 32 บิตทำได้ด้วยวิธีวนซ้ำในเวลา O(32) หรือใช้เทคนิคมาสก์แบบแบ่งแล้วพิชิต ถัดไปเราจะสำรวจสแตกแบบเพิ่มหรือลดอย่างเดียว โดยเริ่มจากค่าคงรูปแบบเพิ่มกับลด และการสอบถามสมาชิกที่มากกว่าถัดไป

คำถามที่พบบ่อย

บทเรียน “การนับบิต จำนวนที่หายไป และการกลับบิต” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การนับบิต จำนวนที่หายไป และการกลับบิต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การนับบิต จำนวนที่หายไป และการกลับบิต”

คำนวณจำนวนบิตของ 0..n ด้วย DP และเทคนิคบิตที่ตั้งค่าต่ำสุด ค้นหาจำนวนที่หายไปด้วย XOR และกลับลำดับบิตของจำนวนเต็ม 32 บิต คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การนับบิต จำนวนที่หายไป และการกลับบิต” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดำเนินการระดับบิต: AND, OR, XOR, NOT และการเลื่อนบิต
  2. จำนวนเดี่ยวและคุณสมบัติของ XOR
  3. บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ
  4. การนับบิต จำนวนที่หายไป และการกลับบิต
← กลับไปที่ Coding Interview Prep