2

I need help with a code that check if a binary number is palindrome. Suppose that the input is 21 (10101). In the function i do that:

-copy the value of num1 to num2

-now num1 is 00010101 and num2 is 00010101

-shift(right) the bit of num1 while num1>0

-now num1 is: 00000000|10101000 and num2 is 00010101|00000000

-shift (left) only one position the bit of num1

-now num1 is: 00000001|01010000 and num2 is 00010101|00000000

-now while num1 != num2 i compare the bit and shift num1 left, and num2 right, each loop.

-compare example:

00000001|01010000

00010101|00000000
       |
       V
       1==1

next loop the compare is 0==0

So my code is the following. And i have a problem, because i dont know how to stop the last while (while with while condition: num1!=num2 && flag==true). Obviousbly the condition that i write is not the right way. But i dont how to do that. In this specific case i want to stop it if it checks 5 digit. An then i want to ask if the solution that i do is too difficult, and if there is other way to solve the problem (ps: its normal that i find it difficult? Because i thought to solve it transform the decimal number in binary manually using the while (n>0) -> n%2, than memorize the bit in an array, and do an easy algorithm on the array to check the reverse; but now i want to redo the problem using << and >> operator). Thank you all.

#include <iostream>

using namespace std;

int palindrome(unsigned short);

int main()
{
unsigned short num;

cout << "Inserisci un numero:\t";
cin >> num;

if (palindrome(num) == 1)
    cout << "Palindrome" << endl;
else
    cout << "Not palindrome" << endl;

cout << "\a";
return 0;
}

int palindrome(unsigned short num1)
{
unsigned short num2 = num1;
bool flag = true;

while (num1>0)
{
    num1 >>= 1;
}

num1 <<= 1;

while ((num1 != num2) && (flag == true))
{
    if ((num1 & 1) != (num2 & 1))
    {
        flag = false;
        break;
    }

    num1 <<= 1;
    num2 >>= 1;
}

return flag;
}
Riccardo
  • 192
  • 2
  • 2
  • 11

1 Answers1

2

The solution you provide seems very complicated.
I would suggest a naive approach in which you just iterate the bits one by one starting from both ends of the integer.
As soon as there is a difference in these bit states, you can conclude it is not a palindrome.
If the middle of the integer is reached, then we can conclude it is a palindrome.

#include <stdio.h>
#include <stdbool.h>

bool
palindrome(unsigned short num)
{
  int bit_count=8*(int)sizeof(num);
  int half_bit_count=bit_count/2;
  for(int i=0; i<half_bit_count; ++i)
  {
    bool low=(num&(1u<<i))!=0;
    bool high=(num&(1u<<(bit_count-1-i)))!=0;
    if(low!=high)
    {
      return false;
    }
  }
  return true;
}

int
main(void)
{
  unsigned short i1=0x00A0;
  unsigned short i2=0x05A0;
  unsigned short i3=0xA005;
  unsigned short i4=0x005A;
  printf("%hx --> %d\n", i1, palindrome(i1));
  printf("%hx --> %d\n", i2, palindrome(i2));
  printf("%hx --> %d\n", i3, palindrome(i3));
  printf("%hx --> %d\n", i4, palindrome(i4));
  return 0;
}
prog-fh
  • 13,492
  • 1
  • 15
  • 30
  • Ok. I will try. (Question: how do you do that so fast? im going to think that im stupid :0 ) – Riccardo Jul 20 '19 at 09:54
  • Im a selftaught in c++, an im a position that i finish my book guide. I know concept like input output if else switch array vector list OOP class enumerative namespace pointers poliphormism inheritance and algorithm like selection sort, quick sort, search, binary search recursion ecc. And i do esercise that my book recommended, but too often im slow, and my mind stop. Often i dont know very well how to start a more difficult project. It's normal? – Riccardo Jul 20 '19 at 10:01
  • I've been programming for years. It's normal – stark Jul 20 '19 at 12:36
  • @Riccardo When you program for years, you encounter many situations. Then each time a problem is similar to something you have already done, it rings a bell, and you find quickly a *not so bad* solution inspired from what you already know. But it's not specific to programming, it's just a matter of time, whatever the domain is. – prog-fh Jul 20 '19 at 14:24