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

Algorytm zamiany liczb na system heksadecymalny

Object Storage Arubacloud
+1 głos
505 wizyt
pytanie zadane 24 lutego 2021 w Algorytmy przez ania1210 Nowicjusz (200 p.)

Ma ktoś pomysł jak stworzyć do tego algorytm? Bo coś mi nie wychodzi.

 

//zamiana liczb systemu dziesiętnego na system dwojkowy i heksadecymalny
#include <iostream>
#include <math.h>
#include <windows.h>

using namespace std;

void hexa(int h)
{
	if (h>9)
	{
		if(h==10)
		{
			cout<<"A";
		}
		if(h==11)
		{
			cout<<"B";
		}
		if(h==12)
		{
			cout<<"C";
		}
		if(h==13)
		{
			cout<<"D";
		}
		if(h==14)
		{
			cout<<"E";
		}
		if(h==15)
		{
			cout<<"F";
		}
	}
	else
	{
		cout<<h;
	}
}
main ()
{
	int n,z,h;
	int tab [16];
	char odp;

	do
	{
		cout<<"program zamienia liczby systemu dziesiętnego na system dwojkowy i heksadecymalny"<<endl;
		cout<<"podaj liczbe "<<endl;
		cin>>n;
	
		//wczytywanie bajtu
		for(z=16;z>=1;z--)
		{
				if(n%2==0)
			{
				tab[z]=0;
				n=n/2;
			}
				else
			{
				tab[z]=1;
				n=(n-1)/2;
			}
		}
	
		//odczyt
		cout<<"liczba w systemie dwojkowym:"<<endl;
		for(z=1;z<=16;z++)
		{
			cout<<tab[z];
		}

		cout<<endl;
		cout<<"liczba w systemie heksadecymalnym:"<<endl;
		h=8*tab[1]+4*tab[2]+2*tab[3]+tab[4]; hexa(h);
		h=8*tab[5]+4*tab[6]+2*tab[7]+tab[8]; hexa(h);
		h=8*tab[9]+4*tab[10]+2*tab[11]+tab[12]; hexa(h);
		h=8*tab[13]+4*tab[14]+2*tab[15]+tab[16]; hexa(h);
		cout<<endl;
		cout<<"_ _ _ _ _ _ _ _ _ _ _ _ _ _" <<endl;
		cout<<"Czy zakonczyc? t/n" <<endl; 
		cin>>odp;
	}
	while (odp=='n');
	return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 25 lutego 2021 przez mokrowski Mędrzec (155,460 p.)
void show_hex(uint32_t val) {
	printf("0x");
	for(uint32_t mask = 0xF0000000, shift = 28, num = 0; num = (val & mask) >> shift, mask; mask >>= 4, shift -= 4) {
		num += num < 10 ? 48: 87;
		putchar(num);
	}
	putchar('\n');
}

 

0 głosów
odpowiedź 24 lutego 2021 przez Psz3mo Mądrala (5,030 p.)
edycja 24 lutego 2021 przez Psz3mo

Po pierwsze jeszcze zanim zaczniesz cokolwiek obliczać Zamiast stosować funkcję "heksa" możesz po prostu utworzyć taką tablicę (string lub jak wolisz char).

string tab[16] = { "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" };

W ten sposób zamiast liczbę zwracać do funkcji po prostu od razu ją wypisujesz bez zbędnych zer jak masz w oryginalnym swoim kodzie. W taki sposób:

cout << tab[numer];

Z góry zakładasz że zamieniona liczba, będzie miała do 16 cyfr. Lepiej jest tutaj zastosować tzw. vector - tablica dynamiczna.

Więcej o vectorach

Jak skorzystasz z tej tablicy, będzie po prostu łatwiej. Napisałem na szybko coś takiego:

unsigned int r = a;
	while (r > 1) {
		int j = r % 2;
		vec1.push_back(tab[j]);
		int h = floor(r / 2);
		r = h;
	}
	vec1.push_back(tab[r]);

To jest praktycznie to samo co u ciebie:

for(z=16;z>=1;z--)
        {
                if(n%2==0)
            {
                tab[z]=0;
                n=n/2;
            }
                else
            {
                tab[z]=1;
                n=(n-1)/2;
            }
        }

Tylko u mnie jest  to dla nieokreślonej liczby danych.

Już to tłumaczę robisz funkcję while (dopóki r > 1) - r jest to liczba podana przez użytkownika, w niej obliczasz resztę z dzielenia tej liczby przez 2 i wpisujesz ją do vectora (tablicy) za pomocą polecenia vec1.push_back(tab[j]); zauważ, iż nie wpisujemy bezpośrednio wyniku tylko wypisujemy numer tablicy która zadeklarowaliśmy wcześniej z literami i cyframi. Następnie obliczasz h czyli wynik dzielenia liczby r / 2 i następnie tą liczbą zastępujesz wcześniej zadeklarowane r.

Żeby później wypisać dane z tablicy vector piszesz np. tak:

for (auto it = vec1.crbegin(); it != vec1.crend(); it++) {
		cout << *it;
	}

Wiem, że to może się okazać na początku trudne, ale na pewno kiedyś docenisz tą tablicę. Tylko pamiętaj zanim zastosujesz tan algorytm musisz utworzyć tzw. kopie zmiennej głównej, którą wpisuje użytkownik. U mnie jest to:

unsigned int r = a;

Myślę, że to zrozumiesz, jakbyś czegoś nie rozumiał to napiszsmiley

komentarz 24 lutego 2021 przez Psz3mo Mądrala (5,030 p.)
cout<<"liczba w systemie heksadecymalnym:"<<endl;
        h=8*tab[1]+4*tab[2]+2*tab[3]+tab[4]; hexa(h);
        h=8*tab[5]+4*tab[6]+2*tab[7]+tab[8]; hexa(h);
        h=8*tab[9]+4*tab[10]+2*tab[11]+tab[12]; hexa(h);
        h=8*tab[13]+4*tab[14]+2*tab[15]+tab[16]; hexa(h);
        cout<<endl;

Tego w ogóle nie rozumiem.

komentarz 24 lutego 2021 przez Psz3mo Mądrala (5,030 p.)

Dla szestnastowego zmieniasz liczby w pętli czyli:

unsigned int r = a;
    while (r > 15) {
        int j = r % 16;
        vec1.push_back(tab[j]);
        int h = floor(r / 16);
        r = h;
    }
    vec1.push_back(tab[r]);

 

0 głosów
odpowiedź 25 lutego 2021 przez VBService Ekspert (252,780 p.)
edycja 25 lutego 2021 przez VBService

Czy tylko chcesz przeprowadzić konwersję decimal to hex?
Czy napisać swój algorytm?  smiley

Pierwsze

#include <iostream>

int main()
{
    int decimal;
    std::cout << "Decimal: "; std::cin >> decimal;

    // 1.
    printf("Hex: %x\n", decimal);
    // 2.
    std::cout << "Hex: " << std::hex << decimal;

    return 0;
}

Drugie - propozycja

#include <iostream>

void dec2hex(int decimal) {
    std::string hex="";
    int mod_;

    while (decimal > 0) {
        mod_ = decimal%16;
        if (mod_ < 10)
            hex += static_cast<char>(mod_+48);
        else
            hex += static_cast<char>(mod_+87); // +87 lower letters, +55 upper letters
            
        decimal/=16;
    }
    
    for (int i=hex.size()-1; i>=0; --i)
        std::cout << hex[i];
}

int main()
{
    int decimal;
    std::cout << "Decimal: "; std::cin >> decimal;

    std::cout << "Hex: "; dec2hex(decimal);

    return 0;
}

Podobne pytania

0 głosów
2 odpowiedzi 586 wizyt
0 głosów
1 odpowiedź 1,136 wizyt
pytanie zadane 11 listopada 2016 w Algorytmy przez BlueWee Użytkownik (730 p.)
0 głosów
2 odpowiedzi 224 wizyt
pytanie zadane 1 lutego 2016 w Algorytmy przez natrov Gaduła (3,970 p.)

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 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!

...