كيفية التحقق مما إذا كان التمثيل الثنائي لعدد صحيح هو متناظر؟

StackOverflow https://stackoverflow.com/questions/845772

سؤال

كيفية التحقق مما إذا كان التمثيل الثنائي لعدد صحيح هو متناظر؟

هل كانت مفيدة؟

المحلول

نظرًا لأنك لم تحدد لغة للقيام بذلك، فإليك بعض رموز لغة 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 الخاص بك.

نصائح أخرى

وصحيحة ونأمل:

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

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

    return m == n;
}

وإنشاء 256 خطوط تحتوي على الرسم البياني شار وانها قليلا عكس شار. نظرا لعدد صحيح 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; 
}

وأنا دائما لها وظيفة سياق متناظر الذي يعمل مع سلاسل، وترجع صحيح إذا كان كذلك، كاذبة خلاف ذلك، على سبيل المثال في جاوة. الشيء الوحيد الذي عليك القيام به هو شيء من هذا القبيل:

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

وهناك نسخة عام:

#include <iostream>
#include <limits>
using namespace std;

template <class T>
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 هو حجم كثافة العمليات. إذا في أي لحظة الخاص بك زوجا ليست هي نفسها، أنها ليست سياق متناظر.

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;
}

في بعض الأحيان انها جيدة للإبلاغ عن فشل أيضا؛

وهناك الكثير من الأجوبة كبيرة هنا عن طريقة واضحة للقيام بذلك، من خلال تحليل في شكل أو آخر النقش بت. وصلت إلى التساؤل، رغم ذلك، إذا كان هناك أي حلول الرياضية؟ هل هناك خصائص الأعداد palendromic أننا قد الاستفادة من؟

وهكذا لعبت مع الرياضيات قليلا، ولكن الجواب كان ينبغي أن يكون حقا واضحا منذ البداية. انها تافهة لإثبات أن جميع الأرقام المتناوب الثنائية يجب أن يكون إما غريبا أو صفر. هذا حول بقدر ما كان قادرا على الحصول على معها.

وأظهر القليل من الأبحاث لا تحرك من هذا النوع لقلب مستو العشرية، لذلك إما مشكلة صعبة للغاية أو لا قابلة للحل عن طريق النظام الرسمي. قد يكون من المثير للاهتمام أن يثبت هذا الأخير ...

    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;
}
  1. استدعاء PalInt(i,1) لpallindromes الثنائية
  2. اتصل بـ PalInt(i,3) لـ Octal Palindromes
  3. اتصل بـ PalInt(i,4) لـ Hex Palindromes

وأنا أعلم أن هذه المسألة قد تم نشرها منذ 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 هناك طريقة سهلة إذا فهمت الحساب الثنائي الأساسي، وهنا هو رمز:

    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 <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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top