如何检查整数的二进制表示形式是否是回文?
由于您尚未指定执行操作所用的语言,所以这里有一些C代码(不是最有效的实现,但应该说明这一点:]]
/* flip n */
unsigned int flip(unsigned int n)
{
int i, newInt = 0;
for (i=0; i<WORDSIZE; ++i)
{
newInt += (n & 0x0001);
newInt <<= 1;
n >>= 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固定。有时也报告失败也很好;
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) - 1));
i = i >> bits;
}
return x == t;
}
我知道这个问题已经在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,有一种简单的方法,这是代码:
#include <iostream>
#include <math.h>
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;
}
以下解决方案在python中有效:
希望正确:
创建一个包含字符的256折线图,并将其反转为字符。给定一个4字节的整数,取第一个字符,在图表上查看,将答案与整数的最后一个字符进行比较。如果它们不同,则不是回文,如果中间的字符相同,则重复。如果他们不同,那不是回文,而是。
这里有很多不错的解决方案。我认为,我认为这不是最有效的,但可读性很强:
以下内容应适用于任何无符号类型。 (对有符号类型的位操作往往会遇到问题。)
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中。我唯一需要做的就是:
通用版本:
我认为最好的方法是从头开始并向内工作,即比较第一位和最后一位,第二位和第二位到最后一位,依此类推,它们将具有O(N / 2)其中N是整数的大小。如果您的配对在任何时候都不相同,那就不是回文。