Tytuł: Działania na bitach Wiadomość wysłana przez: admin Luty 15, 2012, 08:51:44 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 -do liczby a ( w zapisie dwójkowym) dopisz z prawej strony b zer. np. 5<<2 -> 0101+00=10100 = 20 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 osób znających komputery, 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. Tytuł: Odp: Działania na bitach Wiadomość wysłana przez: admin Luty 15, 2012, 08:53:15 Zadanie 1. Programobliczają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: Działania na bitach Wiadomość wysłana przez: admin Luty 15, 2012, 13:06:46 Liczby ujemne w zapisie dwójkowym (U2).
Przykład 1. Zapisać liczbę -25. 1. Obliczamy wartość binarną podanej liczby bez znaku - tzn 25 = 11001. 2. Dopisuję z lewej strony znak 1, znak oznacza że będzie to wartość ujemna. Znak 0 oznacza wartość dodatnią. Czyli liczba przyjmuje postać 1 11001. 3. Zamieniam znaki czyli 1 będzie 0 a 0 stanie się jedynką. 0 00110 4. Dodaję wartość 1 (dodaję jeden) do otrzymanej liczby. Wyjaśnienie łopatologiczne: 0 00111. Liczba 0 00110 w zapisie dziesiętnym to 6, do 6 dodaję 1 czyli wychodzi 7. 7 w zapisie dwójkowym to: 0 00111.) |