如何检查整数的二进制表示是否是回文?

如何检查整数的二进制表示是否是回文?

既然你还没有指定一种语言,这里有一些C代码(不是最有效的实现,但它应该说明一点):

 /* flip n */ unsigned int flip(unsigned int n) { int i, newInt = 0; for (i=0; i>= 1; } return newInt; } bool isPalindrome(int n) { int flipped = flip(n); /* shift to remove trailing zeroes */ while (!(flipped & 0x0001)) flipped >>= 1; return n == flipped; } 

编辑为您的10001事件修复。

希望正确:

 _Bool is_palindrome(unsigned n) { unsigned m = 0; for(unsigned tmp = n; tmp; tmp >>= 1) m = (m << 1) | (tmp & 1); return m == n; } 

创建一个包含char的256行图表,它有点反转char。 给定一个4字节的整数,取第一个字符,在图表上查找,将答案与整数的最后一个字符进行比较。 如果它们不同,它不是回文,如果与中间字符重复相同。 如果它们不同,那么它不是回文。

这里有很多不错的解决方案。 在我看来,让我添加一个效率最高但非常易读的内容:

 /* Reverses the digits of num assuming the given base. */ uint64_t reverse_base(uint64_t num, uint8_t base) { uint64_t rev = num % base; for (; num /= base; rev = rev * base + num % base); return rev; } /* Tells whether num is palindrome in the given base. */ bool is_palindrome_base(uint64_t num, uint8_t base) { /* A palindrome is equal to its reverse. */ return num == reverse_base(num, base); } /* Tells whether num is a binary palindrome. */ bool is_palindrome_bin(uint64_t num) { /* A binary palindrome is a palindrome in base 2. */ return is_palindrome_base(num, 2); } 

以下内容应适用于任何无符号类型。 (签名类型的位操作往往充满问题。)

 bool test_pal(unsigned n) { unsigned t = 0; for(unsigned bit = 1; bit && bit <= n; bit <<= 1) t = (t << 1) | !!(n & bit); return t == n; } 
 int palidrome (int num) { int rev = 0; num = number; while (num != 0) { rev = (rev << 1) | (num & 1); num >> 1; } if (rev = number) return 1; else return 0; } 

我总是有一个与Strings一起使用的回文函数,如果是,则返回true,否则返回false,例如在Java中。 我唯一需要做的就是:

 int number = 245; String test = Integer.toString(number, 2); if(isPalindrome(test)){ ... } 

通用版本:

 #include  #include  using namespace std; template  bool ispalindrome(T x) { size_t f = 0, l = (CHAR_BIT * sizeof x) - 1; // strip leading zeros while (!(x & (1 << l))) l--; for (; f != l; ++f, --l) { bool left = (x & (1 << f)) > 0; bool right = (x & (1 << l)) > 0; //cout << left << '\n'; //cout << right << '\n'; if (left != right) break; } return f != l; } int main() { cout << ispalindrome(17) << "\n"; } 

我认为最好的方法是从最后开始向内工作,即比较第一位和最后一位,第二位和倒数第二位等,其中有O(N / 2)其中N是int的大小。 如果在任何时候你的对不一样,它不是回文。

 bool IsPalindrome(int n) { bool palindrome = true; size_t len = sizeof(n) * 8; for (int i = 0; i < len / 2; i++) { bool left_bit = !!(n & (1 << len - i - 1)); bool right_bit = !!(n & (1 << i)); if (left_bit != right_bit) { palindrome = false; break; } } return palindrome; } 

有时报告失败也是好事;

通过分析某种forms或其他位模式,这里有很多很好的答案。 不过,我想知道,如果有任何数学解决方案吗? 是否有我们可能利用的古代数字属性?

所以我玩了一点数学,但答案应该从一开始就很明显。 certificate所有二元回文数必须是奇数或零是微不足道的。 这就是我能够得到的。

一个小小的研究显示没有这种十进制回文的方法,所以它要么是一个非常困难的问题,要么通过正式系统无法解决。 certificate后者可能很有意思……

  public static bool IsPalindrome(int n) { for (int i = 0; i < 16; i++) { if (((n >> i) & 1) != ((n >> (31 - i)) & 1)) { return false; } } return true; } 
 bool PaLInt (unsigned int i, unsigned int bits) { unsigned int t = i; unsigned int x = 0; while(i) { x = x << bits; x = x | (i & ((1<> bits; } return x == t; } 
  1. 将PalInt(i,1)称为二元pallindromes
  2. 给Octal Palindromes打电话给PalInt(i,3)
  3. 给Hex Hex Palindromes打电话给PalInt(i,4)

我知道这个问题已在2年前发布,但我有一个更好的解决方案,不依赖于字大小和所有,

 int temp = 0; int i = num; while (1) { // let's say num is the number which has to be checked if (i & 0x1) { temp = temp + 1; } i = i >> 1; if (i) { temp = temp << 1; } else { break; } } return temp == num; 

在JAVA中有一个简单的方法,如果你理解基本的二元airthmetic,这里是代码:

  public static void main(String []args){ Integer num=73; String bin=getBinary(num); String revBin=reverse(bin); Integer revNum=getInteger(revBin); System.out.println("Is Palindrome: "+((num^revNum)==0)); } static String getBinary(int c){ return Integer.toBinaryString(c); } static Integer getInteger(String c){ return Integer.parseInt(c,2); } static String reverse(String c){ return new StringBuilder(c).reverse().toString(); } 
 #include  #include  using namespace std; int main() { unsigned int n = 134217729; unsigned int bits = floor(log(n)/log(2)+1); cout<< "Number of bits:" << bits << endl; unsigned int i=0; bool isPal = true; while(i<(bits/2)) { if(((n & (unsigned int)pow(2,bits-i-1)) && (n & (unsigned int)pow(2,i))) || (!(n & (unsigned int)pow(2,bits-i-1)) && !(n & (unsigned int)pow(2,i)))) { i++; continue; } else { cout<<"Not a palindrome" << endl; isPal = false; break; } } if(isPal) cout<<"Number is binary palindrome" << endl; }