我们如何检查数字是否为回文数(以256为基数),但不将其转换为以256为基数?

时间:2018-10-30 10:41:03

标签: bit-manipulation

给出一个数字,必须以256为基数检查是否是回文。具体问题是必须使用位操作对其进行检查,并且不应考虑数字的前0位。

1 个答案:

答案 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,但仅使用按位运算符。