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

Unia i przerabianie shorta na binara

Object Storage Arubacloud
0 głosów
235 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)

Próbowałem napisać program przerabiający uprzednio wczytywaną zmienną short na liczbę w systemie binarnym. Oto co mi wyszło:

#include <iostream>

using namespace std;

union k
{
    bool i[3];
    short u;
};

k unia;

int main()
{
    cin >> unia.u;
    for(int i = 0; i <= 3; i++)
    {
        cout << zmienna.i[i];
    }

}

Wyjście:

input: 4567 Output:2151700

Jedyne co mogę jeszcze dodać : Ratunku!!!

komentarz 3 lipca 2018 przez Ptaszor3 Użytkownik (900 p.)
Wiem, że liczbę binarną można zapisać za i w ogóle za pomocą "0b". Nie zmienia to faktu, że bardzo mnie to interesuje.
komentarz 3 lipca 2018 przez j23 Mędrzec (194,920 p.)

Założyłeś, że typ bool ma wielkość jednego bita?
 

komentarz 3 lipca 2018 przez Ptaszor3 Użytkownik (900 p.)
tak

1 odpowiedź

+1 głos
odpowiedź 3 lipca 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 3 lipca 2018 przez Ptaszor3
 
Najlepsza

To co, próbujesz zrobić, to wydrukowanie poszczególnych bajtów osobno, co w konsekwencji oznacza, że drukujesz interpretację dziesiętną trzech bajtów. 

Tak swoją drogą, to używanie unii do tego typu operacji nie jest najlepszym pomysłem. Standard nie definiuje, czy faktycznie bajty z tablicy i będą pokrywały się z bajtami zmiennej typu short w unii, więc nie powinieneś "siekać" shorta przy użyciu tej tablicy. O ile pamiętam, to Grębosz w Symfonii C++ używa tego tricku, ale nie jest to najlepszy pomysł. Najczęściej jednak ten sposób działa, co wynika tylko ze sposobu implementacji przez autorów kompilatorów, a nie definicji standardu.

Co do rozwiązania, lepszym sposobem będzie użycie bitset:
 

#include <iostream>
#include <bitset>

int main()
{
    short x;
    std::cin >> x;
    
    std::bitset<sizeof(short) * 8> x_bin(x);
    std::cout << x_bin;
}

Jako parametr szablonu przyjmowany jest rozmiar sekwencji bitowej w bitach - w tym przypadku jest to rozmiar shorta (często 2 bajty) * liczba bitów w bajcie (najczęściej 8) - łącznie 16 bitów. Jako parametr konstruktora podana jest liczba, na podstawie której "powstanie" nasz bitset.

Oczywiście można też napisać własną funkcję, które wykorzysta operacje bitowego AND oraz przesunięcie bitowe do wyświetlenia liczby w jej reprezentacji dwójkowej.

komentarz 3 lipca 2018 przez Ptaszor3 Użytkownik (900 p.)
Właśnie z książki pana Grzębosz ten pomysł wziąłem. Dziękuje za pomysł na rozwiązanie, niestety nie do końca je rozumiem z powodu nieznajomości szablonów. Bardzo interesuje mnie jednak powód takiego zachowania tej tablicy. Dlaczego pierwsze dwa elementy typu bool (które według mojej wiedzy mają 1 bit) powoduje powstanie liczby zdecydowanie większej od 1 lub 0 a dwa ostatnie przechowują wartość 0. Rozumiem, że pomimo tych "magicznych" zachowań pomysł ten może spełznąć na niczym ze względu na "przełamywanie" się bajtów shorta.
1
komentarz 3 lipca 2018 przez monika90 Pasjonat (22,940 p.)
edycja 3 lipca 2018 przez monika90
Standard gwarantuje że wszystkie składowe unii mają ten sam adres, więc bajty będą się pokrywać przynajmniej częściowo. Za to nie można, poza pewnymi wyjątkami, zapisać coś w jednej składowej a czytać z innej.

@Ptaszor3
W Twoim kompilatorze bool zajmuje jeden bajt. W jakimś innym mogło by być większe, ale na pewno nie mniejsze.

Podobne pytania

0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 12 września 2018 w C i C++ przez Mate113 Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 362 wizyt
pytanie zadane 12 listopada 2023 w C i C++ przez whiteman808 Obywatel (1,820 p.)
0 głosów
0 odpowiedzi 924 wizyt
pytanie zadane 14 grudnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

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

...