Odwrócic kod binarny w prawidlową stronę

0
#include <iostream>

#define rozmiar 32

using namespace std;

char* funkcja(int liczba)
{
	char* tab = new char[sizeof(int) + 100]{};

	int i = 0;
	
	int x;

	while (liczba)
	{
		tab[rozmiar] = liczba % 2 + '0';
		liczba >>= 1;
		i++;
		 

		if (liczba & 2 == 1)
		{

			tab[rozmiar] = '1';

		}


		if (liczba & 2 == 0)
		{

			tab[rozmiar] = '0';

		}

	    cout << tab[rozmiar];
		

	}
        
	    return tab;
	
}

	int main()
    {
     int a;

	
	 cout << "Prosze podac liczbe: " << endl;
	 cin >> a;

	 funkcja(a);

	

	 return 0;
    }

Cześć. Nie mogę zrobić kodu binarnego odwrotnie, tak jak powinno być. Jutro musze przekazać pracę. Proszę o pomoc z kodem, aby był zgodny z moim programem

0

Odwróć a potem wypisz, zamiast wypisywać podczas obliczeń. Najlepiej by było żeby funkcja zamieniająca w ogóle nie zajmowała się wypisywaniem - SRP.

0
kq napisał(a):

Odwróć a potem wypisz, zamiast wypisywać podczas obliczeń. Najlepiej by było żeby funkcja zamieniająca w ogóle nie zajmowała się wypisywaniem - SRP.

Tak, wiem, ale problem polega na tym, że w ogóle nie wiem jak go odwrócić:) I też jak go prawidłowo wypiśać w int main()

1
  1. Wyrzuć cout << tab[rozmiar];
  2. Przypisz gdzieś wynik tej funkcji
  3. Wypisz wynikową tablicę od tyłu
2

Wszystkie sugestie które dostałeś są dobre, ja dorzucę od siebie
Piszesz w C++ - użyj std::string zamiast dynamicznie alokowanej tablicy znaków !

Kilka pomysłów jak możesz to zrobić odwracanie (albo go uniknąć)

  1. Sprawdź ile cyfr ma Twoja liczba w systemie binarnym (przypomnij sobie ze szkoły logarytmy) i konwertuj od najwyższego bitu a nie najniższego
  2. Użyj std::string i kolejne cyfry doklejaj na początku - generalnie to zły pomysł (kosztowny), ale Twoje liczby są małe i raczej nie będziesz tej funkcji często wywoływać
  3. Rekurencyjna implementacja pozwala łatwo uzyskać taki efekt jak chcesz mieć
1
#include <iostream>
#include <bitset>
#include <sstream>

using namespace std;

unsigned int reverse_bits(unsigned int value) {
  unsigned int result = 0;
  while(value) {
  	result <<= 1;
  	result |= (value & 1);
  	value >>= 1;
  }
  return result;
}

template<typename T>
static std::string as_bin(T value) {
  std::stringstream ss;	
  ss << std::bitset<sizeof(T) * 8>(value);
  return ss.str();
}

void test(unsigned int input, unsigned int expected_result) {
  unsigned int reversed = reverse_bits(input);
  if (reversed == expected_result) {
  	cout << "Test OK for " << as_bin(input) << " = " << as_bin(reversed) << endl;
  } else {
  	cout << "Test FAIL for " << as_bin(input) << " = " << as_bin(reversed) << endl;
  }
}

int main() {
	cout << "Enter value: ";
	unsigned int value;
	cin >> value;
	unsigned int reversed = reverse_bits(value);
	cout << "input as bin: " << as_bin(value) << endl;
	cout << "reversed as bin: " << as_bin(reversed) << endl;
	test(0b0, 0b0);
	test(0b1, 0b1);
	test(0b10, 0b01);
	test(0b110, 0b011);
	test(0b11111100, 0b111111);
	return 0;
}

https://ideone.com/0WOXW5

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