Operacje na bitach - 3 zadania - cdn ...

0

user image

Głównie do BookaYashee !

Witam,na poczatek dzieki za pomoc:

6.2

1/przesuniecia bitowe - zakumałem, reasumując jeśli mamy np. cyfrę 32768 co jest wynikiem 215 to: 215 <<2 == 217 = 131072 a 215 >>2 == 213 = 8192, czy dla liczby 128 która jest wynikiem 27 przesunięcie bitowe o 5 wyglądają tak: 27 <<5 == 212 = 4096 a 27 >>5 == 22 = 4.
I teraz co ciekawsze zakumałem przesunięcie bitowe z zerowaniem >>> tzn. dla liczb ujemnych wynikami >> i << są też liczby ujemne ale >>> jest liczbą dodatnio i to dośc ciekawą. Doszedłem do tego jak ją wyliczyć np. dla liczby "MINUS" -512 == 2^9 (-1) działania:
<<3 == 2^12
(-1) = -4096

3 == 2^6 *(-1) = -64
natomiast >>>3 wyliczam tak:

3 == 2(32-3)-26 == 229-26 = 536870912 - 64 = 536870848 !!
wyjaśnienia: (32-3) od pełnego zakres 32bitów odejmuję tyle o ile mam przesunąć , w tym przypadku o 3 i zostaje nam 29 !!
26 jest wynikiem 29>>3 i to należy odjąć !

Może tylko pytanie jakby to wyglądało graficznie (01) na przykładzie 10 bitów dla liczby ujemniej -256 czyli 2^8 (*-1) bo tak:
2^8 = 0010000000
<<2 = 1000000000

2 = 0000100000

// PYTANIE:

a ja to rozumieć, cytuję: "sytuacja dla operatora >>> różni się tylko tym że najstarsze bity są uzupełniane bitem znaku, czyli dla liczb ujemnych jedynka a zerem dla dodatnich."?

2 = 0000111111 <- z powyższego wniskuję że tak

6.3

też skumałem, przykład dla innych liczb 11 i 14

1011 - 11
1110 - 14

1111 - 15 (suma "|")
1010 - 10 (ilosczyn "&")

6.4

i to skumałem, przykład dla tych samych liczb 11 i 14 wykorzystując operato r przypisania ^= i wykonując operację podwójnie

1011 - 11
1110 - 14

0101 - 5 - pojedyńczy XOR z przypisaniem daje liczbę 5 (11 ^= 14) = 5
1110 - ponowne wykonanie XOR liczną 14

1011 - 11 - wynik podwójnego przypisania XOR na liczbie 11 liczbą 14 daje wynik (11 = 14 = 14) = 11

I to pewnie na tyle by było, nie wiem czy do praktycznej nauki JAVY aż takie zgłębiane tematu, rozwiązywanie i analizowanie zadań jest potrzebne, nie wiem czy potem w praktyce programując będzie potrzeba posiadania takiej wiedzy ale jakoś mnie to wciągnęło i nic ze zeszło mi trochę, jest satysfakcja że się kuma o co chodzi Jeszcze raz dzięki za pomoc i czekam na wyjaśnienie jeszcze tego >>>3 jak powyżej pytałem (goto // PYTANIE)
Zaglądnąłem jeszcze teraz do Thinking in Java wyd.3 PL i kosmos, tutaj faktycznie jest to bardziej wyjaśnione ale już mnie czacha zaczyna boleć, chyb anie będę aż tak się wgłebiał w ten temat, może kiedyś jak zajdzie takowa konieczność, może jak skończę Pratyczny kurs M. Lisa to przelecę wówczas Think. IN Java 3 pl, zobaczę
Dzięki jeszcze raz
##################
były "nie_kasowac_please"

0

Witam,
na początku wininny jestem Ci przeprosiny bo pomyliłem pewne fakty (pisałem z pamięci) i wprowadziłem Cię w błąd.
Operator >> przesuwa bity w prawo ale z propagacją znaku

byte b = 127; -> 01111111
b >> 1 -> 00111111 (63)
b >> 2 -> 00011111 (31)
b >> 3 -> 00001111 (15)

Dla liczb ujemnych wygląda to w następujący sposób:
byte b = -64; -> 11000000
b >> 1 -> 11100000 (-32)
b >> 2 -> 11110000 (-16)
b >> 3 -> 11111000 (-8)
c >> 4 -> 11111100 (-4)

Natomiast operator >>> uzupełnia najstarsze bity zerami
Zapomniałem też o fakcie, że zapis liczb jest w kodzie U2 czyli nie jest tak, że
(ograniczmy się do wartosci byte czyli 8 bitów do reprezentacji liczby)
00000001 == 1 a 10000001 == -1 w U2 jest
00000001 == 1 a 11111111 == -1
dla wyjasnienia oblicza to się w następujący sposób
bit znaku, czyli najstarszy jest brany jako liczba ujemna, tutaj -128 reszta jako odpowiednie dodatnie, czyli
11111111 == -1
-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 == -1

Ztąd biorą się błedy w twoim rozumowaniu (-512 << 3) >> 3 nadal jest równe -512
-512 to od 32 miejsca do 9 miejsca jedynki a reszta to zera, przesówamy o 3 i teraz jest od 32 do 12 to jedynki czyli liczba -4096 o 3 w prawo i jest znowu tak jak było na początku bo bity z prawej uzupełniały się jedynką.

Funkcje logiczne sumy iloczynu i xor są dobrze.

Co do podwójnego xorowania to gratuluje spostrzegawczości, matematycy odkryli tą własność już dawno temu, została ona wykorzystana do szyfrowania danych z kluczem.
Jeśli mamy tekst jawny i xorujemy go z jakimś kluczem to uzyskujemy tekst tajny. Wystarczy teraz tekst tajny znowu xorować z kluczem i z powrotem mam tekst jawny.

Co do praktyczności to jest to urzyteczne w tzw maskowaniu. Dam tu przykład z klasy Event, metody isShiftDown() sprawdzajacej czy został wcisnięty klawisz shift.
Sama metoda wyglada tak

public boolean isShiftDown() {
        return (modifiers & SHIFT_MASK) != 0;
    }

// dodam ze sama zmienna SHIFT_MASK wygląda tak
public static final int SHIFT_MASK      = 1 << 0;

czyli defacto SHIFT_MASK to po prostu 1
metoda zwraca wartość typu boolean po sprawdzeniu czy iloczyn bitowy zmiennych modifiers i SHIFT_MASK jest różny od zera
Zmienna modyfiers przechowuje wartości kluczy klawiszy modyfikujących czyli shift control alt meta i tak na przykład control ma wartość 2 czyli po wcisnięciu control i shift zmienna modifires wynosi 3, teraz zauważ jakie długie byłoby wyciąganie z tego informacji jakie klawisze zostały wcisnięte a metoda isShiftDown() przypomocy operacji bitowych wyciaga to w jednej linijce;

PS
Pisząc tego posta zauważyłem, że poprzedni wątek z tym tematem poleciał do kosza, w sumie kwalifikował się ze względu na temat i login, ale Admin/Moderator przesadził, bo co innego jak na taki wątek nikt nie odpowiada a co innego jak ktoś jednak odpowie. Jeśli nikt by nie odpowiedział no to poprosu autor takiego wątku po skasowaniu nauczyłby się pisać w zgodzie z etykietą forum ale jesli ktoś odpowiedział to znaczy, że poświęcił swój czas na odpowiedź a osoba która wyżuciła to do kosza po prostu olała tą osobe i jej czas.

Pozdrawiam BookaYashee

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0