Bitowy palindrom i problem z konwersją liczby na system binarny

0

Cześć, uczę się do poprawki z algorytmów i nie mogę sobie poradzić z bitowym palindromem. Moim zadaniem jest napisanie programu, który najpierw wczytuje liczbę podaną przez użytkownika, zamienia ją na system binarny, a następnie sprawdza, czy jest ona palindromem, czy nie. Jeżeli jest, wyświetla 1, jeżeli nie, to 0.

W moim programie zamiast liczby binarnej wyświetlane są znaki zapytania. Rozumiem, że chodzi o zły typ zmiennej, ale żeby uzyskać wszystkie 32 bity liczby binarnej do głowy przychodzi mi tylko tabela typu string :/

Poniżej kod który napisałem. Dzięki za pomoc :)

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

void checker(int a)
{
    int checker = 0;
	int i=0, k = 31;
	string tab[32];

	while(a)
	{
		tab[i++]=a%2;
		a/=2;
	}

	for(int j=i-1;j>=0;j--)
    {
        cout << tab[j];
    }
    while(i<k)
    {
        if(tab[i] == tab[k])
        {
            checker++;
            i++;
            k--;
        }
        else
        {
         break;
        }
    }
    if(checker == 32)
    {
        cout << "1" << endl;
    }
    else
     {
         cout << "0" << endl;
     }
}

int main()
{
	int a;

	cout << "Type in the number";
	cin >> a;
	checker(a);
	cout << endl;

	system("pause");
	return 0;
}

0
YooSy napisał(a):

https://en.cppreference.com/w/cpp/utility/bitset

Facet od labków nie zgadza się na użycie bitsetu :/

1

Było kiedyś

unsigned int reverseSignificantBits(unsigned int x) {
   auto r = 0u;
   while (x) {
        r = r * 2 + x % 2;
        x /= 2;
   }
   return r;
}

bool isBitPalidrome(unsigned int x) {
     return x == reverseSignificantBits(x);
}
0

A nie da się nic z moim kodem wykombinować? Pytam, bo jestem dość zielony w programowaniu, i taki sposób mi najprościej przyswoić :/

Nie bardzo widzę o co chodzi z tą linijką

auto r = 0u

I jak teraz próbuję to skompilować, to wywala mi "auto changes meaning in c++11, please remove it" :/

0
loobson1 napisał(a):

Nie bardzo widzę o co chodzi z tą linijką

auto r = 0u

u to przyrostek Unsigned. Dzięki temu typ dla r zostanie wydedukowany jako unsigned int, a oszczędzasz sobie palców na pisanie

unsigned int r = 0;
0

CodeBlocks nie czytał mi tego auto, więc trochę pozmieniałem, i program w ogóle się nie kompiluje :/

#include <iostream>

using namespace std;

unsigned int reverseSignificantBits(unsigned int x) {
   unsigned int r = 0;
   while (x) {
        r = r * 2 + x % 2;
        x /= 2;
   }
   return r;
}

bool isBitPalidrome(unsigned int x) {
     return x == reverseSignificantBits(x);
}

0
 tab[i++]=a%2;

Reszta z dzielenia jest liczbą. Przypisujesz ją do tablicy znakowej, stąd dziwne znaki.
Jeżeli chcesz uzyskać znak '0' to musisz użyć tab[i++]='0'+a%2. Analogicznie '1' to tab[i++]='0'+a%2. Czyli wystarczy tab[i++]='0'+a%2

0

W tym momencie zostało mi tylko ogarnięcie dlaczego pożera mi pierwsze 0, które wychodzi z a%2, i nie wpisuje jej do tab

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

void checker(int a)
{
    int checker = 0;
	int i=0, k=31;
	unsigned int tab[32];

	while(a)
	{
		tab[i++]=a%2;
		a/=2;
	}

	for(int j=i-1;j>=0;j--)
    {
        cout << tab[j];
    }
    while(i<k)
    {
        if(tab[i] == tab[k])
        {
            checker++;
            i++;
            k--;
        }
        else
        {
         break;
        }

    }
    if(checker == 32)
    {
        cout << "" << endl;
        cout << "1" << endl;
    }
    else
     {
         cout << "" << endl;
         cout << "0" << endl;
     }
}

int main()
{
	int a;

	cout << "Type in the number";
	cin >> a;
	checker(a);
	cout << endl;

	system("pause");
	return 0;
}
0

co robi ten kod?

 if(checker == 32)
    {
        cout << "" << endl;
        cout << "1" << endl;
    }
    else
     {
         cout << "" << endl;
         cout << "0" << endl;
     }

jest potrzebny?

0
  while(i<k)

Dlaczego taki warunek?
Jeżeli wprowadzasz tylko jedną cyfrę to i=1.
A pętla wykonuje się 31 razy...

0

w pętli

 while(i){
..
    i--
...
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1