สมมติว่าเรามีค่า start และ end สองค่า เราต้องหาค่าระดับบิต AND ของตัวเลขทั้งหมดในช่วง [start, end] (รวมทั้งสองค่า)
ดังนั้น หากอินพุตเป็นเหมือน start =8 end =12 เอาต์พุตจะเป็น 8 คือ 1,000 ในรูปแบบไบนารีและ 12 คือ 1100 ในรูปแบบไบนารี ดังนั้น 1,000 AND 1001 และ 1010 และ 1011 และ 1100 คือ 1,000 ซึ่งเท่ากับ 8
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=end - start + 1
- x :=0
- สำหรับ b ในช่วง 31 ถึง 0, ลดลง 1 ทำ
- ถ้า 2^b
- ออกมาจากลูป
- ถ้า 2^b
- ถ้า 2^b AND start AND end ไม่ใช่ศูนย์ แล้ว
- x :=x + (2^b)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(start, end): n = end - start + 1 x = 0 for b in range(31, -1, -1): if (1 << b) < n: break if (1 << b) & start & end: x += 1 << b return x start = 8 end = 12 print(solve(start, end))
อินพุต
8, 12
ผลลัพธ์
8