Kiểm tra biểu diễn nhị phân của số N có chứa 2 bit 1 liên tiếp hay không.
Ví dụ: 12 = 1100₂ (có), 10 = 1010₂ (không).
Chiêu bitwise
N & (N >> 1) != 0 ⇔ có ít nhất 1 cặp bit 1 liên tiếp.
Giải thích: Dịch phải 1 bit, sau đó AND. Nếu có cặp 11 thì tại vị trí đó cả 2 đều là 1 → kết quả ≠ 0.
Chương trình C++
#include <iostream>
#include <bitset>
using namespace std;
bool hasConsecutiveOnes(int n) {
return (n & (n >> 1)) != 0;
}
int main() {
vector test = {12, 10, 67, 5, 3, 6, 7};
for (int n : test) {
cout << n << " (" << bitset<8>(n) << ") -> "
<< (hasConsecutiveOnes(n) ? "Co bit 1 lien tiep" : "Khong co") << "\n";
}
return 0;
}
Kết quả
12 (00001100) -> Co bit 1 lien tiep 10 (00001010) -> Khong co 67 (01000011) -> Co bit 1 lien tiep 5 (00000101) -> Khong co 3 (00000011) -> Co bit 1 lien tiep 6 (00000110) -> Co bit 1 lien tiep 7 (00000111) -> Co bit 1 lien tiep