ให้เราพิจารณาว่าเรามีจำนวนเต็ม n ปัญหาคือต้องตรวจสอบว่าจำนวนเต็มนี้มีรูปแบบอื่นในรูปแบบไบนารีที่เทียบเท่าหรือไม่ รูปแบบอื่นหมายถึง 101010….
วิธีการคือ:คำนวณ num =n XOR (n>> 1) ตอนนี้ถ้าบิตของ num ทั้งหมดเป็น 1 แล้ว num จะมีรูปแบบสลับกัน
ตัวอย่าง
#include <iostream> #include <algorithm> using namespace std; bool isAllBitSet(int n){ if (((n + 1) & n) == 0) return true; return false; } bool hasAlternatePattern(unsigned int n) { unsigned int num = n ^ (n >> 1); return isAllBitSet(num); } int main() { unsigned int number = 42; if(hasAlternatePattern(number)) cout << "Has alternating pattern"; else cout << "Has no alternating pattern"; }
ผลลัพธ์
Has alternating pattern