给出一个数字,必须以256为基数检查是否是回文。具体问题是必须使用位操作对其进行检查,并且不应考虑数字的前0位。
答案 0 :(得分:0)
假设数字是64位整数,并且不考虑前导0位,则可以通过找到数字的长度(基数256)并从开始和结束比较每组八位位组来解决。
#include <iostream>
#include <cstdint>
using namespace std;
int get_length(int64_t n) {
int sz = 0;
while(n) {
n >>= 8;
sz++;
}
return sz;
}
bool is_palindrome(int64_t n) {
int64_t mask = 0xff;
int sz = get_length(n);
for (int i = 0, j = sz - i - 1; i < j; i++, j--) {
int left = (n & (mask << (8*i))) >> (8*i);
int right = (n & (mask << (8*j))) >> (8*j);
if (left != right)
return false;
}
return true;
}
int main(void) {
int64_t n;
cin >> n;
cout << is_palindrome(n);
return 0;
}
但是,从本质上讲,这等效于找出数字的基数256,但仅使用按位运算符。