Как проверить, является ли двоичное представление целого числа палиндромом? - PullRequest
7 голосов
/ 10 мая 2009

Как проверить, является ли двоичное представление целого числа палиндромом?

Ответы [ 15 ]

17 голосов
/ 23 июня 2009

Надеюсь, правильно:

_Bool is_palindrome(unsigned n)
{
    unsigned m = 0;

    for(unsigned tmp = n; tmp; tmp >>= 1)
        m = (m << 1) | (tmp & 1);

    return m == n;
}
11 голосов
/ 10 мая 2009

Поскольку вы не указали язык, на котором это нужно сделать, вот код на 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.

3 голосов
/ 10 мая 2009

Создать 256-строчную диаграмму, содержащую символ и его битовый символ. учитывая 4-байтовое целое число, возьмите первый символ, посмотрите на график, сравните ответ с последним целым числом. если они отличаются, то это не палиндром, если те же самые повторяют со средними символами. если они отличаются, это не палиндром, иначе это так.

2 голосов
/ 10 мая 2009

Много хороших решений здесь. Позвольте мне добавить один, который, на мой взгляд, не самый эффективный, но очень читаемый:

/* 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);
}
1 голос
/ 01 октября 2014
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; 
}
1 голос
/ 11 мая 2009

Следующее должно быть адаптировано к любому типу без знака. (Битовые операции на подписанных типах, как правило, чреваты проблемами.)

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;
}
0 голосов
/ 08 июня 2014
#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;
}
0 голосов
/ 09 января 2014

В JAVA есть простой способ, если вы понимаете основную бинарную аэрметику, вот код:

    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();
     }
0 голосов
/ 15 мая 2013
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;
}
  1. Вызов PalInt (i, 1) для двоичных паллиндромов
  2. Позвоните Палинту (i, 3) для Восьмеричного Палиндрома
  3. Call PalInt (i, 4) для шестнадцатеричных палиндромов
0 голосов
/ 10 марта 2012

Я знаю, что этот вопрос был опубликован 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;
...