ฉันต้องการทดสอบว่าตำแหน่ง (จาก 0 ถึง 31 สำหรับจำนวนเต็ม 32 บิต) ที่มีค่าบิต 1 เป็นพื้นที่ที่ต่อเนื่องกันหรือไม่ ตัวอย่างเช่น:
00111111000000000000000000000000 is contiguous
00111111000000000000000011000000 is not contiguous
ฉันต้องการให้การทดสอบนี้คือฟังก์ชันบางอย่างhas_contiguous_one_bits(int)
เป็นแบบพกพา
วิธีหนึ่งที่ชัดเจนคือการวนซ้ำตำแหน่งเพื่อค้นหาบิตเซ็ตแรกจากนั้นบิตแรกที่ไม่ได้ตั้งค่าและตรวจสอบบิตที่กำหนดเพิ่มเติม
ฉันสงสัยว่ามีวิธีที่เร็วกว่านี้หรือไม่? หากมีวิธีการที่รวดเร็วในการค้นหาบิตชุดสูงสุดและต่ำสุด (แต่จากคำถามนี้ดูเหมือนว่าไม่มีแบบพกพา) การใช้งานที่เป็นไปได้คือ
bool has_contiguous_one_bits(int val)
{
auto h = highest_set_bit(val);
auto l = lowest_set_bit(val);
return val == (((1 << (h-l+1))-1)<<l);
}
เพื่อความสนุกสนานนี่คือ 100 จำนวนเต็มแรกที่มีบิตต่อเนื่องกัน:
0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 60 62 63 64 96 112 120 124 126 127 128 192 224 240 248 252 254 255 256 384 448 480 496 504 508 510 511 512 768 896 960 992 1008 1016 1020 1022 1023 1024 1536 1792 1920 1984 2016 2032 2040 2044 2046 2047 2048 3072 3584 3840 3968 4032 4064 4080 4088 4092 4094 4095 4096 6144 7168 7680 7936 8064 8128 8160 8176 8184 8188 8190 8191 8192 12288 14336 15360 15872 16128 16256 16320
พวกเขามี (แน่นอน) ของแบบฟอร์ม(1<<m)*(1<<n-1)
ที่มีไม่ใช่เชิงลบและm
n
0x0
มีขนาดกะทัดรัด ง่ายกว่าที่จะกำหนดสิ่งที่ตรงกันข้าม (ไม่ใช่แบบกะทัดรัด): หากมีบิตที่ตั้งค่าไว้เช่นมีบิตที่ไม่ได้ตั้งค่าอย่างน้อยหนึ่งบิตอยู่ระหว่างพวกเขา