Kiểm tra xem biểu diễn nhị phân của một số có đọc xuôi và ngược giống nhau (palindrome) hay không. Ví dụ: 5 = 101₂ → palindrome.
Thuật toán: Đảo bit (Bit Reversal)
- Duyệt bit từ LSB (bit thấp) đến MSB (bit cao) của số gốc.
- Xây số đảo ngược: dịch trái
rev <<= 1, nếu bit gốc = 1 thì set bit thấp của revrev ^= 1. - So sánh số gốc với số đảo. Nếu bằng nhau → palindrome.
Mã nguồn
using System;
public class Demo {
// Đảo bit của số (chỉ các bit ý nghĩa, bỏ leading zeros)
public static long ReverseBits(long num) {
long rev = 0;
while (num > 0) {
rev <<= 1; // Dịch trái rev để chừa chỗ cho bit mới
if ((num & 1) == 1) // Nếu bit thấp của num là 1
rev ^= 1; // Set bit thấp của rev = 1 (XOR với 1)
num >>= 1; // Dịch phải num để lấy bit tiếp theo
}
return rev;
}
public static bool IsBinaryPalindrome(long num) {
long rev = ReverseBits(num);
return num == rev;
}
public static void Main() {
long num = 5; // 101 nhị phân
if (IsBinaryPalindrome(num))
Console.WriteLine("Palindrome Number");
else
Console.WriteLine("Not a Palindrome Number");
}
}
Kết quả
Palindrome Number
Các số có nhị phân palindrome (≤ 100)
0 (0) 1 (1) 3 (11) 5 (101) 9 (1001) 15 (1111) 17 (10001) 21 (10101) 27 (11011) 31 (11111) 33 (100001) 45 (101101) 51 (110011) 63 (111111) 65 (1000001) 73 (1001001) 85 (1010101) 93 (1011101) 99 (1100011)
Lưu ý
- Hàm
ReverseBitsbỏ qua leading zeros —6 (110)đảo thành3 (11)→ không palindrome (đúng, vì 110 ≠ 011). - Nếu muốn tính cả leading zeros (ví dụ 8-bit: 00000110), cần biết bit-width cố định.
- Dùng
ulongcho 64-bit, tránh sign extension khi dịch phải. - .NET 5+:
BitOperations.ReverseBits(hardware accelerated trên ARM/x64 hỗ trợ).