• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed zamiana liczby na postać binarną

Object Storage Arubacloud
0 głosów
677 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez tomes235 Początkujący (320 p.)
zamknięte 21 kwietnia 2020 przez tomes235

Witam. Mam problem z zapisaniem liczby w postaci binarnej. Dla dodatnich jest wszystko ok. Problem zaczyna pojawiać się dla liczb ujemnych. Próbowałem zanegować tablicę, ale wychodzi  mi liczba typu -1,-2,-1,-1,-2....itd. Oczywiście postać binarna ma składać się również z zer wiodących.

#include <iostream>
using namespace std;

void zamiana(int value)
{
	int i = 0, tab[31];

	for(int k=31;k>0;k--){
		if (value < 0) {
			value = value * (-1);
			tab[i++] = value % 2;
			value /= 2;
			
		}
			tab[i++] = value % 2;
			value /= 2;
		
		
	}
	

	for (int j = i - 1; j >= 0; j--){
		
			cout <<tab[j];
		}
}

int main()
{
	int value;
	cin >> value;
	zamiana(value);

}

 

komentarz zamknięcia: Uzyskano odpowiedź
komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

2 odpowiedzi

0 głosów
odpowiedź 21 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
wybrane 21 kwietnia 2020 przez tomes235
 
Najlepsza
void zamiana(int value)
{
    int i = 0, tab[31];
 
    for(int k = 31; k > 0; --k) {
        tab[i++] = value & 1;
        value >>= 1;
    }
 
    for (int j = i - 1; j >= 0; j--) {
            std::cout << tab[j];
    }
} 

 

komentarz 21 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
PS. w zasadzie to tam powinny być 32 bity a nie 31.
komentarz 21 kwietnia 2020 przez tomes235 Początkujący (320 p.)
co robi w tej funkcji (value & 1)?
komentarz 21 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

To samo co u Ciebie value % 2. Inne podejście (na poziomie bitowym) na zrobienie tego samego (dobry kompilator i tak zamieni % 2 na & 1).

komentarz 21 kwietnia 2020 przez tomes235 Początkujący (320 p.)
#include <iostream>
using namespace std;

void zamiana(int value, int przesuniecie)
{
	int i = 0, tab[32];

	for (int k = 32; k > 0; --k) {
		tab[i++] = value &1;
		value >>= 1;
	}

	for (int j = i - 1; j >= 0; j--) {
		std::cout << tab[j];
	}
	
	for (int j = 0 ; j <przesuniecie; j++) {
		tab[j] = tab[j] >> przesuniecie;;
	}
	
}



int main()
{
	int value;
	int przesuniecie;
	cin >> value;
	cin >> przesuniecie;
	zamiana(value,przesuniecie);

}

mam jeszcze jedno pytanko masz moze pomysl jak przesuwac ta tablice o k-mozliwosci w sensie chodzi mi o przesuniecie cykliczne (wymyslilem narazie cos takiego)

komentarz 21 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
To musi być na tablicy?
komentarz 21 kwietnia 2020 przez tomes235 Początkujący (320 p.)

nie musi, tylko wlasnie mam malo mozliwosci, wymyslilem jeszcze cos takiego

#include<iostream>
#include<string>

using namespace std;
void zamiana3(int liczba, int przesuniecie) {
	string newbinary = "";
	int unsigned mask = 0x80000000;

	string binaryliczba = "";
	while (mask > 0) {
		if ((liczba & mask) != 0) {
			binaryliczba += "1";
		}
		else {
			binaryliczba += "0";
		}
		mask = mask >> 1;
	}
	cout << binaryliczba << endl;


	for (int i = 0; i < binaryliczba.size() - przesuniecie; i++) {

		newbinary += binaryliczba[i];
	}
	for (int j = 0; j < przesuniecie; j++) {
	newbinary = binaryliczba[(binaryliczba.size() - 1)-j] + newbinary;

}
	
	cout << newbinary << endl;
	

}



	

int main() {
	int liczba;
	int przesuniecie;
	cin >> liczba;
	cin >> przesuniecie;
		zamiana3(liczba, przesuniecie);
		
}

 

komentarz 21 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
unsigned shift = 3; // nie większe niż 31

v = (v << (32 - shift)) | (v >> shift);

v powinno być typu unsigned int.

0 głosów
odpowiedź 21 kwietnia 2020 przez Bondrusiek Maniak (61,370 p.)

Witam,

tak na szybko nie podoba mi się ten warunek

        if (value < 0) {
            value = value * (-1);
            tab[i++] = value % 2;
            value /= 2;
             
        }
            tab[i++] = value % 2;
            value /= 2;

Spróbuj użyć else

        if (value < 0) {
            value = value * (-1);
            tab[i++] = value % 2;
            value /= 2;
             
        }
else
{
            tab[i++] = value % 2;
            value /= 2;
}

 

komentarz 21 kwietnia 2020 przez tomes235 Początkujący (320 p.)
ale to tak naprawdę nie ma znaczenia, bo jak pomnożę razy (-1) to i tak wychodzi zawsze z pętli if i robi else

Podobne pytania

0 głosów
1 odpowiedź 971 wizyt
0 głosów
5 odpowiedzi 3,527 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)
0 głosów
1 odpowiedź 9,110 wizyt
pytanie zadane 17 października 2016 w C i C++ przez kakola3 Początkujący (270 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...