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

Konwersja z liczby szesnastkowej na binarną

VPS Starter Arubacloud
0 głosów
1,578 wizyt
pytanie zadane 22 sierpnia 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

Czy istnieje jakaś funkcja, która automatycznie zamienia liczbę w systemie szesnastkowym na binarną?

Robię to zadanie: https://pl.spoj.com/WSDOCPP/problems/HEXTOBIN/ i myślałam nad użyciem jakiejś funkcji, która zamieni liczby automatycznie. 

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map < char, int > zamianaSystemow;

    zamianaSystemow[0] = 0;
    zamianaSystemow[1] = 0001;
    zamianaSystemow[2] = 0010;
    zamianaSystemow[3] = 0011;
    zamianaSystemow[4] = 0100;
    zamianaSystemow[5] = 0101;
    zamianaSystemow[6] = 0110;
    zamianaSystemow[7] = 0111;
    zamianaSystemow[8] = 1000;
    zamianaSystemow[9] = 1001;
    zamianaSystemow['A'] = 1010;
    zamianaSystemow['B'] = 1011;
    zamianaSystemow['C'] = 1100;
    zamianaSystemow['D'] = 1101;
    zamianaSystemow['E'] = 1110;

  int rozmiarTAblicy;


  for (int i = 0; i < zamianaSystemow.size(); i++) {
         cin >> zamianaSystemow[i];
         cout << zamianaSystemow[i]; //funkcja miałaby być tutaj
         cout << endl;

  }

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 23 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)
wybrane 23 sierpnia 2020 przez magda_19
 
Najlepsza
1) ustawiłaś że map przechowuje char jako klucz to czemu podajesz mu inty, w sensie zamiast [0] powinno być ['0'] itd.

2) wartość mapy ustawiłaś na inta, a podajesz mu jakieś niewiadomo co, bo ani to liczba dziesiętna, ani string. zmień inta na stringa i podawaj mu stringi

3) Po co for?

4) Nie nie chcesz nic wczytywać do mapy, a z niej odczytać. Wczytaj znak do jakiekiejś zmiennej pomocniczej.

5) Nie musisz wszystkiego cache'ować zamiana systemów liczbowych jest bardzo prosta. Btw. Zelent to dobrze tłumaczy.
komentarz 23 sierpnia 2020 przez magda_19 Gaduła (3,080 p.)
edycja 23 sierpnia 2020 przez magda_19

Dzięki za odpowiedź, bardzo pomogłeś. Poprawiłam kod, u mnie działa, ale SPOJ go nie chce zaakceptować. Wygląda to tak:

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{

    string cyfraSzesnastkowa = " ";

    map < char, string > zamianaSystemow;

    zamianaSystemow['0'] = "0000";
    zamianaSystemow['1'] = "0001";
    zamianaSystemow['2'] = "0010";
    zamianaSystemow['3'] = "0011";
    zamianaSystemow['4'] = "0100";
    zamianaSystemow['5'] = "0101";
    zamianaSystemow['6'] = "0110";
    zamianaSystemow['7'] = "0111";
    zamianaSystemow['8'] = "1000";
    zamianaSystemow['9'] = "1001";
    zamianaSystemow['A'] = "1010";
    zamianaSystemow['B'] = "1011";
    zamianaSystemow['C'] = "1100";
    zamianaSystemow['D'] = "1101";
    zamianaSystemow['E'] = "1110";

    while (cin >> cyfraSzesnastkowa) {
        for (int i = 0; i < cyfraSzesnastkowa.length() ; i++) {
        map <char, string> :: iterator itr = zamianaSystemow.find(cyfraSzesnastkowa[i]);
                cout << itr->second;
            }
            cout << endl;


        }

    return 0;
}

 

2
komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Brakuję Ci "F".
komentarz 23 sierpnia 2020 przez VBService Ekspert (251,170 p.)
edycja 23 sierpnia 2020 przez VBService

Nie wiem czy to kod na SPOJ-a, ale przy małych literach "wywalało" błąd iteracji.

#include <iostream>
#include <map>
#include <cstring>

std::string toupper_(std::string text)
{
    for (auto & c: text) c = toupper(c);
    return text;
}

int main()
{
    std::string inputHex = "";
    std::map <char, std::string> mapHexToBin;
        mapHexToBin['0'] = "0000";
        mapHexToBin['1'] = "0001";
        mapHexToBin['2'] = "0010";
        mapHexToBin['3'] = "0011";
        mapHexToBin['4'] = "0100";
        mapHexToBin['5'] = "0101";
        mapHexToBin['6'] = "0110";
        mapHexToBin['7'] = "0111";
        mapHexToBin['8'] = "1000";
        mapHexToBin['9'] = "1001";
        mapHexToBin['A'] = "1010";
        mapHexToBin['B'] = "1011";
        mapHexToBin['C'] = "1100";
        mapHexToBin['D'] = "1101";
        mapHexToBin['E'] = "1110";
        mapHexToBin['F'] = "1111";

    while (std::cin >> inputHex) {
        inputHex = toupper_(inputHex);

        for (int i=0; i<inputHex.length() ; ++i) {
            std::map <char, std::string> :: iterator itr = mapHexToBin.find(inputHex[i]);
            std::cout << itr->second;
        }

        std::cout << std::endl;
    }

    return 0;
}

komentarz 23 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)

@magda_19,

Podana jest tylko jedna cyfra nie potrzebujesz żadnej pętli.

cyfraSzesnastkowa  lepiej, by była typu char, aby łatwo odczytać wartość z mapy.

+2 głosów
odpowiedź 23 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Użycie tego nagłówka w tym przypadku jest bezsensu. Jest masa lepszych rozwiązań. Abstrahując od tego, że bitset nie obsługuję heksadecymalnych liczb.
komentarz 23 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
Za mało wiesz ;)
komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Więcej pokory... Udowodnij, że się mylę, zamiast rzucać słowa bez pokrycia.
komentarz 23 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
set::bitset<64> bs = (std::bitset<64>(val >> 32) << 32)  | 
                     std::bitset<64>(val & 0xffffffff);

coś mi się wydaję, że ten kod wyliczy hex'a. Ale mogę się mylić wink

komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

Równie dobrze możesz zapisać to w ten sposób std::bitset<8> b(0xfff0). Użyj takiego zapisu by był pomocny dla autorki pytania.
Jeżeli już skądś kopiujesz, to popraw literówki. https://stackoverflow.com/questions/18354787/hex-input-to-bitset64-c
Nie masz pojęcia o czym piszesz...

komentarz 23 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
Hmm jakoś mi to działa, ale dziwne że troszeńkę przerobiony kod działa
komentarz 23 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

@tkz, możesz pokazać jakieś z tych lepszych rozwiązań? std::bitset fajnie się tu sprawdza:

int number;
std::cin >> std::hex >> number;
std::cout << std::bitset<4>(number);
komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Tutaj już nie masz samego bitset'u, a funkcje z iostream. Sam bitset do tego nie służy...
Możesz rozwiązać podobnie do tego co Ty masz z pomocą sstream. Nawet rozwiązanie autorki jest o niebo lepsze.
komentarz 23 sierpnia 2020 przez Wiciorny Ekspert (269,120 p.)

@tkz,  ale on napisał 2 BIBLIOTEKI DO C++ mając 18 lat, nikt nie widział ich nawet :D ale są! Więc ja bym się tu nie kłócił, szczególnie :D przeglądając jego pytania- warto mieć na uwadzę, żę coś jest nie halo i odpuścić 

komentarz 23 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Tutaj już nie masz samego bitset'u, a funkcje z iostream.

No i w czym problem? Ktoś napisał używaj tylko std::bitset-u?

Możesz rozwiązać podobnie do tego co Ty masz z pomocą sstream. Nawet rozwiązanie autorki jest o niebo lepsze.

To jest ta masa lepszych rozwiązań? Że co, wpiszesz std::bitset-a do std::ostringstream-a, wywołasz std::ostringstream::str() i do std::cout-a? To nie jest lepsza alternatywa, tylko zrobienie tego samego okrężną drogą. I nie wiem w czym rozwiązanie z mapą jest o niebo lepsze od rozwiązania z std::bitset-em. Pamiętaj, że to jest zadanie na SPOJa.

Najlepszą alternatywą pod względem wydajnościowym w tym zadaniu jaka przychodzi mi do głowy, wydaje się być LUT, gdzie element zerowy to "0000", element pierwszy "0001" itd. Ale jeżeli chodzi o zwięzłość i prostotę rozwiązania std::bitset wygrywa.

A jeżeli tu nie chodzi o to, żeby podzielić się wiedzą i znaleźć najlepsze rozwiązanie, tylko dogryzać Official gildinowi i nabijać się z niego, to przepraszam że przeszkodziłem. Z resztą Ty też Official gildin mógłbyś sobie darować odpowiedzi w stylu "Za mało wiesz ;)".

komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

Tutaj już nie masz samego bitset'u, a funkcje z iostream.

No i w czym problem? Ktoś napisał używaj tylko std::bitset-u?

W tym problem, że można równie dobrze zaprzęgnąć wyspecjalizowaną bibliotekę do tego.

Możesz rozwiązać podobnie do tego co Ty masz z pomocą sstream. Nawet rozwiązanie autorki jest o niebo lepsze.

To jest ta masa lepszych rozwiązań? Że co, wpiszesz std::bitset-a do std::ostringstream-a, wywołasz std::ostringstream::str() i do std::cout-a? To nie jest lepsza alternatywa, tylko zrobienie tego samego okrężną drogą. I nie wiem w czym rozwiązanie z mapą jest o niebo lepsze od rozwiązania z std::bitset-em. Pamiętaj, że to jest zadanie na SPOJa.

Jest w tym lepsze, że jest czytelniejsze. Oczywiście pojawi się za moment "dla mnie jest czytelne", dla Ciebie tak, dla innych nie. Kod ma być najprostszy jak się tylko da. 

int number;
std::cin >> std::hex >> number;
std::cout << std::bitset<4>(number);

To rozwiązanie jest dobre dla 4 bitowych liczb, czyli od 0, do 15. Nie ma w tym rozwiązaniu ani grama elastyczności. 

komentarz 23 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

W tym problem, że można równie dobrze zaprzęgnąć wyspecjalizowaną bibliotekę do tego.

Zawsze można, do każdego zadania możesz dołożyć złożoności ile chcesz. Przecież z tym podejściem się nie da linijki kodu napisać.

int number;
std::cin >> std::hex >> number;
std::cout << std::bitset<4>(number);

To jest nieczytelne? Przecież ten kod wprost mówi: "wczytaj liczbę jako hexa, wypisz jako zestaw 4 bitów".

Elastyczność rozwiązania z mapą, dobre. Jak liczby zaczną być 32-bitowe, to po prostu dopiszesz sobie 2^32-16 kolejnych przypadków. No i jakie będzie wtedy czytelne. Bo w tym kodzie powyżej byśmy musieli zmienić 4 na 32. Tragedia.

komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

W tym problem, że można równie dobrze zaprzęgnąć wyspecjalizowaną bibliotekę do tego.

Zawsze można, do każdego zadania możesz dołożyć złożoności ile chcesz. Przecież z tym podejściem się nie da linijki kodu napisać.

Czym mniejsza złożoność, tym lepiej. 

Dodatkowo nigdzie nie napisałem, że kod który wkleiłeś jest nieczytelny. To co napisałeś w formie kodu jest nieczytelne. 

Elastyczność rozwiązania z mapą, dobre. Jak liczby zaczną być 32-bitowe, to po prostu dopiszesz sobie 2^32-16 kolejnych przypadków. No i jakie będzie wtedy czytelne. Bo w tym kodzie powyżej byśmy musieli zmienić 4 na 32. Tragedia.

Kompletnie nie chodzi o to "że sobie dopiszesz". Kod ma działać, Twój działa, ale tylko dla grupy liczb. Zmieniając argument z 4, na 32 uzyskamy masę nieznaczących zer. 

#include <iostream>
#include <bitset>

int main()
{
int number;
std::cin >> std::hex >> number;
std::cout << std::bitset<4>(number)<<'\n';
std::cout << std::bitset<32>(number);
}

0xffff
1111
00000000000000001111111111111111 

Nie widzę tutaj elastyczności. Z mojej strony to wszystko. 

komentarz 23 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

 Czym mniejsza złożoność, tym lepiej.

Jak wyznaczasz złożoność rozwiązania z mapą, złożoność rozwiązania z std::bitset-em? Może mam gdzieś błąd w moich obliczeniach, bo mi wychodzi, że oba rozwiązania mają niską złożoność, są mało skomplikowane.

Zmieniając argument z 4, na 32 uzyskamy masę nieznaczących zer.

Czytałeś treść zadania? To jest pożądane zachowanie. I to, że będziesz miał nieznaczące zera z przodu sprawia, że odrzucasz rozwiązanie, a konieczność dopisania 2^32 linijek kodu Ci nie przeszkadza.

komentarz 23 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
@tkz a nie mówiłem ?
komentarz 23 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
set::bitset<64> bs = (std::bitset<64>(val >> 32) << 32)  | 
                     std::bitset<64>(val & 0xffffffff);

Wyjaśnij ten zapis, to będziemy mogli pogadać. Kopiowanie czegokolwiek z internetu nie przyznaje Ci racji z automatu. 
 

2
komentarz 23 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)

@Piotr Batko, Moim zdaniem rozwiązanie z bitsetem jest zwięzłe, fajne i przydatne, ale widząc na jakim poziomie jest autor pytania, nie ma sensu sugerować, gotowych rozwiązań, których nie będzie rozumiał.

komentarz 24 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

@jankustosz1, Zgadzam się. Ja odpowiadałem tkz na to co napisał o std::bitsec-ie.

Użycie tego nagłówka w tym przypadku jest bezsensu. Jest masa lepszych rozwiązań.

Chciałem poznać tę masę lepszych rozwiązań, ale nic z tego niestety nie wyszło.

komentarz 24 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)

No tkz taki mądry ale jakby miał podać jakiś przykład to zazwyczaj daj linka do https://stackoverflow.com/

komentarz 24 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Na szybko: sstream, hex, operacje bitowe, mapa, tak na szybko. Pewnie jest masa innych sposobów. To, że bitset to niejako potrafi, nie implikuje na to, że jest do tego stworzony.
komentarz 24 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

@Official gildin, 99% pytań powtarza się z tymi na stacku, różnica jest tak, że potrafię wytłumaczyć to co wklejam. 

komentarz 24 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
Czyli w teorii dajesz "gotowca" ;)
komentarz 24 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
"Gotowca", którego należy w znacznej większości przerobić na własne potrzeby. Co zmusza pytającego do zrozumienia kodu.

Podobne pytania

0 głosów
1 odpowiedź 671 wizyt
0 głosów
2 odpowiedzi 113 wizyt
+1 głos
2 odpowiedzi 638 wizyt
pytanie zadane 2 sierpnia 2020 w C i C++ przez RufinB Obywatel (1,830 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...