ให้แยกรหัสบรรทัดทีละบรรทัด
ตัวตรวจสอบ int = 0; เรากำลังเริ่มต้นตัวตรวจสอบซึ่งจะช่วยให้เราค้นหาค่าที่ซ้ำกัน
int val = str.charAt (i) - 'a'; เราได้รับค่า ASCII ของตัวละครที่ตำแหน่ง 'i'th ของสตริงและลบมันด้วยค่า ASCII ของ' a ' เนื่องจากข้อสันนิษฐานคือสตริงเป็นอักขระที่ต่ำกว่าเท่านั้นจำนวนของอักขระที่ จำกัด ไว้ที่ 26 ถึงแม้ว่าค่าของ 'val' จะเป็น> = 0 เสมอ
ถ้า ((ตัวตรวจสอบ & (1 << val))> 0) คืนค่าเท็จ
ตัวตรวจสอบ | = (1 << val);
ตอนนี้เป็นส่วนที่ยุ่งยาก ให้เราพิจารณาตัวอย่างด้วยสตริง "abcda" นี่ควรกลับเท็จ
สำหรับการวนซ้ำ 1:
ตัวตรวจสอบ: 000000000000000000000000000000000000
val: 97-97 = 0
1 << 0: 0000000000000000000000000000000001
ตัวตรวจสอบ & (1 << val): 00000000000000000000000000000000 ไม่ใช่> 0
ดังนั้นตัวตรวจสอบ: 000000000000000000000000000000000001
สำหรับการวนซ้ำวนซ้ำ 2:
ตัวตรวจสอบ: 000000000000000000000000000000000001
val: 98-97 = 1
1 << 0: 0000000000000000000000000000001010
ตัวตรวจสอบ & (1 << val): 00000000000000000000000000000000 ไม่ใช่> 0
ดังนั้นตัวตรวจสอบ: 000000000000000000000000000000000011
สำหรับการวนซ้ำ 3:
ตัวตรวจสอบ: 000000000000000000000000000000000011
val: 99-97 = 0
1 << 0: 00000000000000000000000000000100
ตัวตรวจสอบ & (1 << val): 00000000000000000000000000000000 ไม่ใช่> 0
ดังนั้นตัวตรวจสอบ: 000000000000000000000000000000000111
สำหรับการวนซ้ำลูป 4:
ตัวตรวจสอบ: 000000000000000000000000000000000111
val: 100-97 = 0
1 << 0: 00000000000000000000000000001000
ตัวตรวจสอบ & (1 << val): 00000000000000000000000000000000 ไม่ใช่> 0
ดังนั้นตัวตรวจสอบ: 0000000000000000000000000000001111
สำหรับการวนซ้ำลูป 5:
ตัวตรวจสอบ: 0000000000000000000000000000001111
val: 97-97 = 0
1 << 0: 0000000000000000000000000000000001
ตัวตรวจสอบ & (1 << val): 00000000000000000000000000000001 คือ> 0
ดังนั้นกลับเท็จ