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

บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ

สร้างเมธอดช่วยสำหรับตั้งค่า ล้าง สลับ และตรวจสอบบิตแต่ละบิต และใช้บิตมาสก์แทนเซตย่อยในปัญหาการแจกแจงเซตย่อย

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

มาสก์บิตคืออะไร

มาสก์บิตคือจำนวนเต็มที่ใช้เลือก แก้ไข หรือตรวจสอบบิตเฉพาะในจำนวนเต็มอีกตัวหนึ่ง มาสก์จะมีค่า 1 ในตำแหน่งที่คุณสนใจ และมีค่า 0 ในตำแหน่งอื่น เมื่อนำมาใช้ร่วมกับตัวดำเนินการระดับบิต มาสก์จะช่วยให้คุณดำเนินการกับบิตได้อย่างละเอียดโดยไม่กระทบบิตอื่น

การดำเนินการพื้นฐานของมาสก์มีสี่อย่าง ได้แก่ ตั้งค่า (เปิดบิต), ล้างค่า (ปิดบิต), สลับค่า (กลับค่าบิต) และ ตรวจสอบ (ตรวจว่าบิตมีค่าเป็น 1 หรือไม่) แต่ละอย่างใช้ตัวดำเนินการที่แตกต่างกัน — OR, AND-NOT, XOR และ AND ตามลำดับ — ร่วมกับมาสก์ 1 << k

# The four fundamental bit mask operations
def set_bit(n, k):    return n | (1 << k)       # OR to set
def clear_bit(n, k):  return n & ~(1 << k)      # AND-NOT to clear
def toggle_bit(n, k): return n ^ (1 << k)       # XOR to toggle
def check_bit(n, k):  return (n >> k) & 1       # shift+AND to check

n = 0b10110101  # 181
print(f'n = {bin(n)}')
print(f'set   bit 1: {bin(set_bit(n, 1))}')
print(f'clear bit 2: {bin(clear_bit(n, 2))}')
print(f'toggle bit 0: {bin(toggle_bit(n, 0))}')
print(f'check bit 4: {check_bit(n, 4)}')

ตั้งบิต: เปิดบิต

หากต้องการตั้งบิต k (บังคับให้มีค่าเป็น 1 โดยไม่คำนึงถึงค่าเดิม) ให้ทำ OR กับจำนวนโดยใช้มาสก์ 1 << k เนื่องจาก 0 OR 1 = 1 และ 1 OR 1 = 1 บิตเป้าหมายจึงมีค่าเป็น 1 ส่วนบิตอื่นทั้งหมดจะทำ OR กับ 0 ซึ่งไม่เปลี่ยนแปลงค่าเดิม

การตั้งบิตเป็นการดำเนินการแบบทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์ — เรียกใช้หลายครั้งก็ให้ผลเหมือนเรียกใช้ครั้งเดียว หากบิต k มีค่าเป็น 1 อยู่แล้ว ผลลัพธ์จะไม่เปลี่ยนแปลง คุณสมบัตินี้สำคัญต่อการจัดการแฟล็ก เมื่อคุณต้องการเปิดใช้คุณลักษณะโดยไม่ต้องกังวลกับสถานะปัจจุบันของมัน

def set_bit(n, k):
    mask = 1 << k
    return n | mask

# Set various bits
n = 0b00001010  # 10
print(f'Original: {bin(n)} = {n}')
for k in [0, 3, 6, 7]:
    result = set_bit(n, k)
    print(f'Set bit {k}: {bin(result)} = {result}')

# Idempotence: setting already-set bit does nothing
n = 0b1111
print(f'\nAlready set: {bin(set_bit(n, 2))} = {bin(n)} (unchanged)')

# Setting multiple bits at once with a combined mask
mask = (1 << 0) | (1 << 2) | (1 << 4)  # bits 0, 2, 4
print(f'Set bits 0,2,4: {bin(0 | mask)} = {0 | mask}')

ล้างบิต: ปิดบิต

หากต้องการล้างบิต k (บังคับให้มีค่าเป็น 0 โดยไม่คำนึงถึงค่าเดิม) ให้ทำ AND กับจำนวนโดยใช้ส่วนเติมเต็มของมาสก์: n & ~(1 << k) ส่วนเติมเต็ม ~(1 << k) มีบิตทั้งหมดเป็น 1 ยกเว้นบิต k ซึ่งเป็น 0 การทำ AND กับ 0 จะบังคับให้บิตเป้าหมายเป็น 0 ส่วนการทำ AND กับ 1 จะคงค่าบิตอื่นทั้งหมดไว้

เช่นเดียวกับการตั้งบิต การล้างบิตเป็นการดำเนินการแบบทำซ้ำได้โดยไม่เปลี่ยนผลลัพธ์ การล้างบิตที่มีค่าเป็น 0 อยู่แล้วจะไม่เปลี่ยนแปลงจำนวน ในไพทอน ~(1 << k) ทำงานได้ถูกต้องสำหรับ k ทุกค่า เพราะไพทอนจัดการการขยายเครื่องหมายโดยอัตโนมัติ — ในเชิงแนวคิด ส่วนเติมเต็มจะมีบิตที่สูงกว่าทั้งหมดเป็น 1

def clear_bit(n, k):
    mask = ~(1 << k)     # all 1s except bit k
    return n & mask

n = 0b11111111  # 255: all bits set
print(f'Original: {bin(n)} = {n}')
for k in [0, 3, 6, 7]:
    result = clear_bit(n, k)
    print(f'Clear bit {k}: {bin(result)} = {result}')

# Clear multiple bits with combined mask complement
def clear_bits(n, positions):
    mask = 0
    for k in positions:
        mask |= (1 << k)
    return n & ~mask

result = clear_bits(0b11111111, [1, 3, 5, 7])
print(f'Clear bits 1,3,5,7: {bin(result)} = {result}')  # 0b01010101 = 85

สลับบิต: กลับค่าบิต

หากต้องการสลับบิต k (เปลี่ยนจาก 0 เป็น 1 หรือจาก 1 เป็น 0) ให้ทำ XOR กับจำนวนโดยใช้มาสก์ 1 << k การทำ XOR กับ 1 จะกลับค่าบิต ส่วนการทำ XOR กับ 0 จะไม่เปลี่ยนแปลงค่า นี่คือสมบัติพื้นฐานของ XOR ที่นำมาใช้กับบิตเดียว

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

def toggle_bit(n, k):
    return n ^ (1 << k)

n = 0b10101010  # 170
print(f'Original:    {bin(n)}')
print(f'Toggle bit 0: {bin(toggle_bit(n, 0))}')  # off->on: 10101011
print(f'Toggle bit 1: {bin(toggle_bit(n, 1))}')  # on->off: 10101000
print(f'Toggle bit 7: {bin(toggle_bit(n, 7))}')  # on->off: 00101010

# Toggle is its own inverse: two toggles = no change
result = toggle_bit(toggle_bit(n, 3), 3)
print(f'Double toggle bit 3: {bin(result)} == original {bin(n)}? {result == n}')

# Toggle all lower k bits
def toggle_lower_k(n, k):
    mask = (1 << k) - 1   # k ones in the lowest positions
    return n ^ mask

print(f'Toggle lower 4 bits of {bin(n)}: {bin(toggle_lower_k(n, 4))}')

ตรวจสอบบิต: ตรวจว่าบิตถูกตั้งค่าไว้หรือไม่

หากต้องการตรวจสอบว่าบิต k ถูกตั้งค่าไว้หรือไม่ ให้เลื่อนบิตของ n ไปทางขวา k ตำแหน่ง แล้วทำ AND กับ 1: (n >> k) & 1 วิธีนี้จะนำบิต k มาไว้ที่ตำแหน่ง 0 และใช้มาสก์ตัดบิตที่สูงกว่าทั้งหมดออก เหลือค่า 0 (บิต k มีค่าเป็น 0) หรือ 1 (บิต k มีค่าเป็น 1) อีกทางเลือกหนึ่งคือใช้ bool(n & (1 << k)) เพื่อให้ได้ผลลัพธ์จริง/เท็จ

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

def check_bit(n, k):
    return (n >> k) & 1

def is_bit_set(n, k):
    return bool(n & (1 << k))

n = 0b10110101  # 181
print(f'n = {bin(n)} = {n}')
for k in range(8):
    print(f'Bit {k}: {check_bit(n, k)} ({"set" if check_bit(n, k) else "clear"})')

# Count set bits using check_bit
def count_set_bits(n):
    return sum(check_bit(n, k) for k in range(n.bit_length()))

print(f'\nSet bits in {n}: {count_set_bits(n)}')

# Get bit representation as list (LSB first)
def to_bit_list(n, width=8):
    return [check_bit(n, k) for k in range(width)]

print(f'Bit list (LSB first): {to_bit_list(n)}')

มาสก์บิตสำหรับแทนเซตย่อย

จำนวนเต็มที่มี n บิตสามารถแทนเซตย่อยของเซตที่มี n องค์ประกอบได้: บิต k มีค่าเป็น 1 หากองค์ประกอบ k อยู่ในเซตย่อย และเป็น 0 หากไม่อยู่ วิธีนี้บีบอัดเซตย่อยให้เป็นจำนวนเต็มเพียงตัวเดียว ทำให้ดำเนินการได้ในเวลา O(1): ตรวจสมาชิก (mask & (1 << k)), เพิ่มองค์ประกอบ (mask | (1 << k)), ลบองค์ประกอบ (mask & ~(1 << k)) และทำยูเนียน/อินเตอร์เซกชันของเซต (mask1 | mask2 และ mask1 & mask2)

เมื่อมีองค์ประกอบ n ตัว จะมีเซตย่อยที่เป็นไปได้ 2^n เซต โดยแต่ละเซตแทนได้อย่างไม่ซ้ำกันด้วยจำนวนเต็ม n บิตตั้งแต่ 0 ถึง 2^n - 1 การวนผ่านจำนวนเต็มทั้งหมดตั้งแต่ 0 ถึง 2^n - 1 จะเป็นการแจกแจงเซตย่อยทั้งหมด

# Subset representation with bitmasks
elements = ['A', 'B', 'C', 'D']
n = len(elements)

def subset_from_mask(mask):
    return [elements[k] for k in range(n) if (mask >> k) & 1]

# Enumerate all 2^n subsets
print('All subsets:')
for mask in range(1 << n):   # 0 to 15 for n=4
    print(f'  {mask:04b}: {subset_from_mask(mask)}')

# Set operations
mask_ab = 0b0011   # {A, B}
mask_bc = 0b0110   # {B, C}
print(f'\nUnion:        {subset_from_mask(mask_ab | mask_bc)}')
print(f'Intersection: {subset_from_mask(mask_ab & mask_bc)}')
print(f'Difference A\\B: {subset_from_mask(mask_ab & ~mask_bc & 0b1111)}')

วนผ่านเซตย่อยทั้งหมดของมาสก์

ในการเขียนโปรแกรมแบบพลวัตด้วยมาสก์บิต คุณมักต้องวนผ่านเซตย่อยทั้งหมดของมาสก์ที่กำหนด เคล็ดลับทั่วไปคือเริ่มด้วย sub = mask แล้ววนด้วย sub = (sub - 1) & mask จนกว่ามาสก์ย่อยจะมีค่าเป็น 0 ในแต่ละรอบจะได้มาสก์ย่อยที่แตกต่างกัน วิธีนี้ใช้เวลา O(3^n) รวมกันสำหรับมาสก์ทั้งหมด เพราะองค์ประกอบแต่ละตัวอาจอยู่ในมาสก์หลักแต่ไม่อยู่ในมาสก์ย่อย อยู่ในทั้งสองมาสก์ หรือไม่อยู่ในมาสก์ใดเลย

เทคนิคนี้ปรากฏในปัญหาอย่าง 'แบ่งอาร์เรย์เป็นเซตย่อยที่มีค่า XOR เท่ากัน' หรือ 'หาค่า AND สูงสุดของเซตย่อยใด ๆ' ความสามารถในการแจกแจงมาสก์ย่อยอย่างมีประสิทธิภาพเป็นลักษณะเด่นของการเขียนโปรแกรมแบบพลวัตด้วยมาสก์บิตระดับสูง

def all_submasks(mask):
    submasks = []
    sub = mask
    while sub > 0:
        submasks.append(sub)
        sub = (sub - 1) & mask
    submasks.append(0)  # empty subset
    return submasks

mask = 0b1011   # {0, 1, 3}
elements = ['A', 'B', 'C', 'D']
def show(m): return '{' + ','.join(elements[k] for k in range(4) if (m>>k)&1) + '}'

print(f'All submasks of {bin(mask)} = {show(mask)}:')
for sub in all_submasks(mask):
    print(f'  {bin(sub):6s}: {show(sub)}')
print(f'Total: {len(all_submasks(mask))} submasks (should be 2^{bin(mask).count("1")} = {2**bin(mask).count("1")})')

DP ด้วยมาสก์บิต: ภาพรวมปัญหาเซลส์แมนเดินทาง

DP ด้วยมาสก์บิตใช้แก้ปัญหาที่สถานะประกอบด้วย เซตย่อยของรายการที่เยี่ยมชมแล้ว ตัวอย่างคลาสสิกคือปัญหาเซลส์แมนเดินทาง (TSP): ค้นหาเส้นทางที่มีต้นทุนต่ำสุดซึ่งเยี่ยมชมเมือง n เมือง สถานะคือ dp[mask][city] = ต้นทุนต่ำสุดในการเยี่ยมชมเมืองใน mask โดยสิ้นสุดที่ city เมื่อมีเมือง n เมือง จะมีสถานะ 2^n × n สถานะ จึงใช้เวลา O(n^2 × 2^n) ซึ่งเหมาะสมเมื่อ n ≤ 20

มาสก์ทำหน้าที่เป็นเซตเมืองที่เยี่ยมชมแล้วแบบบีบอัด การตั้งค่า การล้าง และการตรวจสอบบิตสอดคล้องกับการเยี่ยมชม การออกจากเมือง และการสอบถามเมืองตามลำดับ นี่คือแก่นของ DP ด้วยมาสก์บิต: ใช้บิตเป็นเซตขนาดกะทัดรัดสำหรับสถานะ

# TSP with bitmask DP
import sys

def tsp(dist):
    n = len(dist)
    INF = float('inf')
    # dp[mask][v] = min cost to reach v having visited cities in mask
    dp = [[INF] * n for _ in range(1 << n)]
    dp[1][0] = 0   # start at city 0, only city 0 visited (mask=1=0b0001)

    for mask in range(1 << n):
        for v in range(n):
            if dp[mask][v] == INF: continue
            if not (mask >> v) & 1: continue  # v must be in mask
            for u in range(n):
                if (mask >> u) & 1: continue  # u must not be visited
                new_mask = mask | (1 << u)
                dp[new_mask][u] = min(dp[new_mask][u], dp[mask][v] + dist[v][u])

    full_mask = (1 << n) - 1
    return min(dp[full_mask][v] + dist[v][0] for v in range(1, n))

dist = [[0,10,15,20],[10,0,35,25],[15,35,0,30],[20,25,30,0]]
print('TSP minimum tour cost:', tsp(dist))  # should be 80

มาสก์หลายบิต: การดึงฟิลด์

บางครั้งคุณต้องดึงข้อมูลไม่ใช่เพียงบิตเดียว แต่เป็น ฟิลด์หลายบิต ซึ่งเป็นช่วงบิตที่ต่อเนื่องกัน หากต้องการดึงบิตตั้งแต่ตำแหน่งเริ่มต้นจนถึงตำแหน่งเริ่มต้นบวกความยาวลบ 1 ให้สร้างมาสก์ที่มีบิต 1 ต่อเนื่องกันจำนวนความยาวบิต: mask = (1 << length) - 1 จากนั้นใช้ (n >> start) & mask

เทคนิคนี้ใช้ในการแยกวิเคราะห์รูปแบบจำนวนเต็มที่จัดเก็บแบบแพ็ก เช่น ที่อยู่ IP ข้อมูลพิกเซล หรือรีจิสเตอร์ฮาร์ดแวร์ ซึ่งค่าขนาดเล็กหลายค่าถูกจัดเก็บไว้ในจำนวนเต็มตัวเดียว ตัวอย่างเช่น พิกเซล RGB565 ขนาด 16 บิตเก็บค่าสีแดงไว้ในบิต 15-11 สีเขียวไว้ในบิต 10-5 และสีน้ำเงินไว้ในบิต 4-0

def extract_field(n, start, length):
    mask = (1 << length) - 1   # e.g., length=3 => mask=0b111
    return (n >> start) & mask

# RGB565 pixel format: RRRRRGGGGGGBBBBB
pixel = 0b1111100111001000  # 63432
red   = extract_field(pixel, 11, 5)   # bits 15-11
green = extract_field(pixel, 5, 6)    # bits 10-5
blue  = extract_field(pixel, 0, 5)    # bits 4-0
print(f'Pixel: {hex(pixel)}')
print(f'Red:   {red}   ({bin(red)})')
print(f'Green: {green} ({bin(green)})')
print(f'Blue:  {blue}  ({bin(blue)})')

# Packing values back
def pack_rgb565(r, g, b):
    return (r << 11) | (g << 5) | b

packe = pack_rgb565(red, green, blue)
print(f'Repacked: {hex(packed) if (packed := pack_rgb565(red,green,blue)) else 0}')

มาสก์บิตในโจทย์สัมภาษณ์

มาสก์บิตมักปรากฏในโจทย์สัมภาษณ์ประเภทต่อไปนี้:

  • การแจกแจงเซตย่อย: วนผ่านเซตย่อย 2^n ทั้งหมดโดยใช้มาสก์ตั้งแต่ 0 ถึง 2^n-1
  • DP แบบบีบอัดสถานะ: เข้ารหัสเซตของโหนดหรือรายการที่เยี่ยมชมแล้วเป็นมาสก์บิตในสถานะ DP
  • ระบบสิทธิ์: รวมตัวบ่งชี้ READ/WRITE/EXECUTE ด้วย OR และตรวจสอบด้วย AND
  • การติดตามเซลล์ที่เยี่ยมชมในตาราง: สำหรับตารางขนาดเล็ก บรรจุเซลล์ที่เยี่ยมชมแล้วไว้ในจำนวนเต็มตัวเดียว

ตัวบ่งชี้สำคัญที่แสดงว่ามาสก์บิตมีประโยชน์คือ the โจทย์เกี่ยวข้องกับ เซตขนาดเล็ก (รายการไม่เกิน 20 รายการ) และคุณต้องติดตามชุดผสมของการเป็นสมาชิก เซตที่ใหญ่กว่านี้ต้องใช้รูปแบบแทนค่าอื่น

# Subset sum with bitmask enumeration
def subset_sum_exists(nums, target):
    n = len(nums)
    for mask in range(1 << n):
        total = sum(nums[k] for k in range(n) if (mask >> k) & 1)
        if total == target:
            subset = [nums[k] for k in range(n) if (mask >> k) & 1]
            print(f'Found subset {subset} summing to {target}')
            return True
    return False

subset_sum_exists([3, 1, 4, 1, 5], 10)  # finds a subset summing to 10

# Check if permutation covers all required elements (bitmask approach)
required = 0b11111  # need all 5 elements
visited  = 0b01101  # visited elements 0, 2, 3
all_visited = (visited & required) == required
print(f'All required visited: {all_visited}')  # False: missing bits 1 and 4

เคล็ดลับการแจกแจงบิตอย่างมีประสิทธิภาพ

เมื่อวนผ่านบิตที่ตั้งค่าไว้ของมาสก์ จะมีการใช้เทคนิคทั่วไปสองวิธี วิธี เลื่อนแล้วตรวจสอบ คือเลื่อนไปทางขวาและตรวจสอบ LSB ส่วนวิธี แยกบิต 1 ที่อยู่ขวาสุด คือแยกบิต 1 ที่อยู่ขวาสุดด้วย n & -n ประมวลผลบิตนั้น แล้วล้างด้วย n &= n - 1 วิธีที่สองจะเยี่ยมชมเฉพาะบิตที่ตั้งค่าไว้ และเร็วกว่าเมื่อมาสก์มีบิตที่ตั้งค่าไว้อยู่เบาบาง

ใน Python คุณยังใช้ bin(n).count('1') หรือ n.bit_count() (3.10 ขึ้นไป) สำหรับการนับบิต 1 ได้ หากต้องการหาตำแหน่งของแต่ละบิตที่ตั้งค่าไว้ ให้ใช้ n.bit_length() - 1 เพื่อหาบิตที่ตั้งค่าไว้ซึ่งอยู่สูงสุด

# Iterate over set bit positions
def set_bit_positions(n):
    positions = []
    k = 0
    while n:
        if n & 1:
            positions.append(k)
        n >>= 1
        k += 1
    return positions

# Faster: use lowest-set-bit isolation
def set_bit_positions_fast(n):
    positions = []
    while n:
        lsb = n & -n           # isolate lowest set bit
        k = lsb.bit_length() - 1  # position of that bit
        positions.append(k)
        n &= n - 1             # clear lowest set bit
    return positions

mask = 0b10110101
print(f'Set positions (naive): {set_bit_positions(mask)}')
print(f'Set positions (fast):  {set_bit_positions_fast(mask)}')
print(f'Bit count: {bin(mask).count("1")}')
print(f'Highest set bit: {mask.bit_length() - 1}')

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

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

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า การดำเนินการมาสก์บิตพื้นฐานสี่อย่างคือ การตั้งค่า (OR) การล้าง (AND-NOT) การสลับค่า (XOR) และการตรวจสอบ (การเลื่อน-AND) จำนวนเต็มสามารถแทนเซตย่อยได้ โดยแต่ละบิตเข้ารหัสการเป็นสมาชิกขององค์ประกอบหนึ่งรายการ ทำให้แจกแจงเซตย่อย 2^n ทั้งหมดได้ และ การดึงฟิลด์หลายบิตกับ DP ด้วยมาสก์บิตใช้หลักการทำมาสก์เดียวกันเพื่อเข้ารหัสสถานะที่ซับซ้อนยิ่งขึ้น ถัดไปเราจะสำรวจการนับบิต จำนวนที่หายไป และการกลับลำดับบิตโดยใช้เทคนิคจากบทเรียนนี้และบทเรียนก่อนหน้า

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

บทเรียน “บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ”

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

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

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

บทเรียน “บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ” ใช้เวลานานแค่ไหน

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

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

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

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

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