Darmowe Forum

C++ => Podstawy C++ cz. I => Wątek zaczęty przez: admin Listopad 30, 2011, 12:08:18



Tytuł: Liczby ujemne w zapisie dwójkowym
Wiadomość wysłana przez: admin Listopad 30, 2011, 12:08:18
Metoda uzupełnień do 1 - kod U1


Zapis w kodzie U1 liczb ujemnych uzyskuje się negując każdy bit reprezentacji binarnej modułu liczby zapisanej w kodzie ZM i dodając bit znaku BZ=1

np. -1110=1 10112ZM=1 01002U1 (też problem z wykonywaniem działań, konieczna korekcja)

    Metoda uzupełnień do 2 (U2)

Bit MSB oznacza znak liczby:

1 - znak ujemny

0 - znak dodatni

Liczby nieujemne bit znaku + liczba w kodzie binarnym (NKB)

Liczby ujemne

    wyznacza się moduł liczby ujemnej i zapisuje się go w systemie znak - moduł np |(-4)|10= (0100)2zm

    w otrzymanym słowie zamienia się 1 na 0, a 0 na 1 1011

    do otrzymanego słowa dodaje się 1 na najmniej znaczącej pozycji słowa. (1100)U2

Przykład 1. Jak przedstawić liczbę -4 w zapisie dwójkowym:
Jeżeli 4 to 00000100,

zamieniamy zera z jedynkami, czyli mamy 11111011

Dodajemy 1, czyli mamy 11111100. I to jest właśnie (-4).


Tytuł: Odp: Liczby ujemne w zapisie dwójkowym
Wiadomość wysłana przez: admin Grudzień 07, 2011, 11:14:36
Zadanie 2. Program obliczający bitową różnicę, przesuniecie w lewo, przesunięcie w prawo, negacja, bitowa alternatywa i koniunkcja.

#include <cstdlib>
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{int a,b;
cout << "Podaj liczbe od 0-15 dla a \n";
cin >> a;
cout << "wprowadz  od 0-15 dla b \n";
cin >> b;
cout << "bitowa roznica symetryczna: " << (a^b) << endl;
cout << "bitowe przesuniecie w lewo: " << (a<<b)<< endl;
cout << "bitowe przesuniecie w prawo: " << (a>>b)<< endl;
cout << "negacja bitowa a " << ~(a) << endl;
cout << "bitowa alternatywa: "  << (a|b) << endl;
cout << "bitowa koniunkcja: " << (a&b) << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}


Tytuł: Odp: Liczby ujemne w zapisie dwójkowym
Wiadomość wysłana przez: admin Grudzień 07, 2011, 11:14:47
Przesunięcie w lewo - polega na dopisaniu do prawej strony liczby bitowej zera, po dopisaniu lewy najstarszy bit znika, tak aby zachować stałą liczbę bitów.
a<<b
Przesuniecie w prawo - polega na dopisaniu zera do lewej strony liczby bitowej, po dopisaniu z lewej strony zera znika najmłodszy bit ( skrajny prawy). Lub przesuniecie o określoną liczbę bitów np.
a>>b gdzie a liczba która będzie przesuwana, b - o tyle bitów przesuwamy liczbę.
np. 1111>>0001 wyświetli wynik 0111,
Bitowa różnica symetryczna - wykrywa różnicę pomiędzy bitami dwóch liczb, jeżeli bity umieszczone na tych samych pozycjach różnią się to wpisywana jest wartość 1 jeżeli bity nie różnią się to wpisywane jest 0.
np.  101
    ^111
    = 010

Negacja - polega na zamianie bitów o wartości 1 na 0 i bitów 0 na 1. Np.
~010 = 101
Wynik działania jest zaskoczeniem nawet dla Adama, bo wynosi -3, dlaczego tak jest?
Jest to spowodowane tym, że aktualnie większość komputerów korzysta z systemu reprezentacji liczb całkowitych U2.  Każda liczba posiada jeden dodatkowy bit znajdujący się na początku i określający czy liczba jest dodatnia (0) czy ujemna (1). Tak więc w rzeczywistości dla komputera 101 to nie jest 5, a -3.  Myśląc na skróty, można napisać pewnik pozwalający na szybkie wyliczenie negacji, czyli
~a == (-a-1). Inaczej mówiąc jeżeli a=2 to ~a=(-2-1)=-3.


Polityka cookies
Darmowe Fora | Darmowe Forum

only-frags watahalion mojeprzysmaki kursor tokiogang