我必须编写一个代码来检查该数字是否是位回文。例如9(1001)是位回文,但6(110)不是有点回文。
我已编写代码将数字转换为字符串,该字符串表示二进制数字,然后检查字符串回文。有没有更好的方法来做到这一点?
答案 0 :(得分:20)
我们可以使用位运算符来完成此操作。我们的想法是从右到左一次读取一个数字的每个位,并从左到右使用这些位生成另一个数字。最后,我们比较这两个数字。 如果它们相同,则原始数字是二进制位回文。
int isBitPalindrome(int x) {
int reversed = 0, aux = x;
while (aux > 0) {
/*
Before doing that shifting reversed to
right, to build it from left to right.
Takes LSB of aux and puts it as LSB of reversed
variable.
*/
reversed = (reversed << 1) | (aux & 1);
/*
Loop depends on number of bits in aux. Takes next bit into
LSB position by shifting aux right once.
*/
aux = aux >> 1;
}
return (reversed == x) ? 1 : 0;
}
答案 1 :(得分:0)
以下实现将在O(n / 2)中执行,其中n是给定数字的位长:
#define LSB(bit_len) 0x1
#define MSB(bit_len) 0x1 << bit_len - 1
int isBitPalindrome(int x) {
int i = 0, bit_len = sizeof(int) * 8;
unsigned int left = 0, right = 0;
while (i < bit_len / 2) {
left = x << i & MSB(bit_len);
right = x >> i & LSB(bit_len);
if ((left == 0x0 && right == 0x0) ||
(left == MSB(bit_len) && right == LSB(bit_len))
i++;
else
break;
}
return (i == bit_len / 2) ? 1 : 0;
}