บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ
สร้างเมธอดช่วยสำหรับตั้งค่า ล้าง สลับ และตรวจสอบบิตแต่ละบิต และใช้บิตมาสก์แทนเซตย่อยในปัญหาการแจกแจงเซตย่อย
บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการระดับบิต: AND, OR, XOR, NOT และการเลื่อนบิต
- จำนวนเดี่ยวและคุณสมบัติของ XOR
- บิตมาสก์: ตั้งค่า ล้าง สลับ และตรวจสอบ
- การนับบิต จำนวนที่หายไป และการกลับบิต