Uczęszczam na kurs college'u na temat systemów operacyjnych i uczymy się, jak konwertować z binarnego na szesnastkowy, dziesiętny na szesnastkowy itp., A dziś właśnie dowiedzieliśmy się, jak liczby podpisane / niepodpisane są przechowywane w pamięci za pomocą uzupełnienia do dwóch (~ liczba + 1).
Mamy kilka ćwiczeń do zrobienia na papierze i chciałbym móc zweryfikować moje odpowiedzi przed przesłaniem mojej pracy nauczycielowi. Napisałem program C ++ dla kilku pierwszych ćwiczeń, ale teraz utknąłem, jak mogę zweryfikować swoją odpowiedź z następującym problemem:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
i musimy pokazać binarną reprezentację w pamięci z a
, b
i c
.
Zrobiłem to na papierze i daje mi następujące wyniki (wszystkie reprezentacje binarne w pamięci liczb po uzupełnieniu do dwóch):
a = 00111010 (to znak, więc 1 bajt)
b = 00001000 (to znak, więc 1 bajt)
c = 11111110 11000101 (jest krótki, więc 2 bajty)
Czy istnieje sposób na zweryfikowanie mojej odpowiedzi? Czy istnieje standardowy sposób w C ++ do wyświetlania reprezentacji binarnej w pamięci liczby, czy też muszę kodować każdy krok osobno (obliczać uzupełnienie dwóch, a następnie konwertować na binarny)? Wiem, że ten ostatni nie potrwa tak długo, ale jestem ciekawy, czy istnieje standardowy sposób, aby to zrobić.
źródło
std::hex
) manipulatora - Zostawię to jako ćwiczenie dla ciebie, aby opracować resztę ...Odpowiedzi:
Najłatwiejszym sposobem jest prawdopodobnie utworzenie
std::bitset
reprezentującej wartości, a następnie przesłanie jej strumieniowocout
.źródło
std::bitset
!+1
ode mnie.bitset
konstruktora @Jesse: jest interpretowany jako wartość bez znaku, która działa tak samo jak uzupełnienie do dwóch. Ściśle mówiąc, C ++ nie gwarantuje arytmetyki dopełniania dwóch, a także-58 >> 3
operacja w twoim przykładzie jest niezdefiniowana.Użyj konwersji w locie do
std::bitset
. Bez zmiennych tymczasowych, bez pętli, bez funkcji, bez makr.Live On Coliru
Wydruki:
źródło
x
użycie:std::cout << std::bitset<8*sizeof(x)>(x)
.Jeśli chcesz wyświetlić bitową reprezentację dowolnego obiektu, a nie tylko liczby całkowitej, pamiętaj, aby najpierw ponownie zinterpretować jako tablicę char, a następnie możesz wydrukować zawartość tej tablicy, w postaci szesnastkowej lub nawet binarnej (za pomocą zestawu bitów):
Zauważ, że najbardziej popularne systemy to little-endian, więc wynik nie
show_binrep(c)
jest 1111111 011000101, którego oczekujesz, ponieważ nie tak zachowuje się w pamięci. Jeśli szukasz reprezentacji wartości w formacie binarnym, to proste działa.cout << bitset<16>(c)
źródło
Nie. Nie ma
std::bin
, jakstd::hex
lubstd::dec
, ale nie jest trudno samemu wyprowadzić binarną liczbę:Wyprowadzasz bit najbardziej w lewo, maskując wszystkie pozostałe, przesuwając w lewo i powtarzając to dla wszystkich bitów, które masz.
(Liczba bitów w typie to
sizeof(T) * CHAR_BIT
.)źródło
Podobnie do tego, co zostało już opublikowane, wystarczy użyć bit-shift i maski, aby uzyskać bit; użyteczny dla dowolnego typu, będąc szablonem (
tylko nie jestem pewien, czy istnieje standardowy sposób na uzyskanie liczby bitów w 1 bajcie, użyłem tutaj 8).źródło
CHAR_BIT
.Funkcja wielokrotnego użytku:
Stosowanie:
Działa to z wszelkiego rodzaju liczbami całkowitymi.
źródło
źródło
int t = pow(2, num_of_bits - 1);
?Korzystając ze starej wersji C ++, możesz użyć tego fragmentu:
źródło
Korzystanie z odpowiedzi std :: bitset i szablonów wygody:
Używając tego w ten sposób:
Generuje dane wyjściowe:
źródło
Oto prawdziwy sposób uzyskania binarnej reprezentacji liczby:
źródło
Czy tego szukasz?
źródło
</argument>
. Naprawdę jesteśmy dorośli, tak? Prawie sprawdziłem wiek wszystkich komentowanych tutaj, aby upewnić się, że wszyscy ukończyli 13 lat.