NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Bitové operátory - Nejasnost ve zdrojovém kódu

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Kindy StillAlive:21.2.2017 17:20

Ahoj :)

Učím se Javu z knihy a jsem u bitových operátorů.

Narazil jsem na tento zdrojový kód:

int i;
byte hodn;
hodn = 123;

for(t = 128; t > 0; t = t/2) {
if((hodn & t) != 0) System.out.print("1 ");
else System.out.print("0 ");
}

V kódu se zobrazují bity hodnoty typu byte.

Našel jsem: V jazyce Java nejsou znaky 8bitovými veličinami jako v mnoha jiných počítačových jazycích.  Java pracuje místo toho s kódováním UNICODE – TOTO kódování dokáže reprezentovat všechny znaky ze všech lidských jazyků. Typ char Javy je 16 bitový typ bez znaménka – má rozsah od 0 do 65 535.

Tuším, že to bude mít něco společného s tím jak se v bitech rozbrazují čísla v UNICODE.

Ale nevím, vítě někdo jak to vysvětlit, ten zdroják?

 
Odpovědět
21.2.2017 17:20
Avatar
Semjacko
Člen
Avatar
Semjacko:21.2.2017 19:54

Vypíše ti číslo v premennej hodn do binárneho tvaru. Na základe splnenia podmienky hodn & t , ktorá porovná bitovú hodnotu aktuálneho t a premennej hodn (t.j. tam kde sa jednotky nachádzaju na rovnakom mieste, tam je po operácii & tiež 1ka). :)

 
Nahoru Odpovědět
21.2.2017 19:54
Avatar
Odpovídá na Semjacko
Kindy StillAlive:22.2.2017 16:28

Děkuju za odpověd :) .. Ale proč je tam řídící proměnná t nastavena na 128 a pak se při každé iteraci cyklu snižuje na polovinu? :(

 
Nahoru Odpovědět
22.2.2017 16:28
Avatar
Odpovídá na Kindy StillAlive
Petr Štechmüller:22.2.2017 16:52

Protože to jsou mocniny dvojky

128 -> 64 -> 32 -> 16 -> 8 -> 4 -> 2 -> 1

Důležitější je ale reprezentace v binární podobě:

128 = 10000000
64   = 01000000
32   = 00100000
16   = 00010000
8     = 00001000
4     = 00000100
2     = 00000010
1     = 00000001

takže potom ve výrazu

(hodn & t) != 0)

t nabývá výše uvedených hodnot.
Dále logický operátor AND má následující tabulku:

A B Q
0 0 0
0 1 0
1 0 0
1 1 1

Takže výraz nahoře bude platný pouze v případě, že proměnná hodn bude mít na pozici t jedničku, ale to už bylo zmíněno o příspěvek výše.

Nahoru Odpovědět
22.2.2017 16:52
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Kindy StillAlive:22.2.2017 17:33

Mockrát děkuji :) .. Už to chápu, porovnávají se postupně bity čísla 123 s s jedničkami na všech místech díky dělení čísla 128 dvěmi v každé iteraci cyklu.. Moc Jste mi pomohli, děkuji oboum :)

 
Nahoru Odpovědět
22.2.2017 17:33
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Kindy StillAlive
ostrozan:26.2.2017 14:29

no nejsem si úplně jistý, že to chápeš - celé to je postavené na bitovém posunu to znamená, že v binárním čísle 10000000 - dekadicky 128 se ta jednička posouvá (v tomto případě) o jednu pozici do prava - zde je jen realizovaný za pomoci dělení dvojkou, případně jejich násobků

takže

128/2 (dělení)
je totéž jako
0b10000000 >>1 (posun o jeden bit)
výsledek je 0b01000000 - dekadicky 64

stejně tak
128/4 (dělení)
je totéž jako
0b10000000 >>2 (posun o dva bity)
výsledek je 0b00100000 - dekadicky 32

atd.........
 
Nahoru Odpovědět
26.2.2017 14:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.