Java: byte to 8 boolean

dušo

Java: byte to 8 boolean
« kdy: 10. 03. 2014, 15:48:17 »
Ahojte,

v škole na IT som nedal pokoj učiteľovi ohľadom veľkosti premenných typu boolean v jave a došli sme až k tomu, či sa dá rozložiť byte premenná na 8 booleanov... takže som dostal špeciálnu domácu úlohu za bonusové body: Rozložiť byte na 8 booleanov :D

riešil som to hľadaním na nete a upravením na moj prípad:

Kód: [Vybrat]
public static boolean[] ByteToBooleanArray(byte p)
{
boolean bTemp[]=new boolean[8];
bTemp[0]=((p & 0x01)!=0);
bTemp[1]=((p & 0x02)!=0);
bTemp[2]=((p & 0x03)!=0);
bTemp[3]=((p & 0x04)!=0);
bTemp[4]=((p & 0x05)!=0);
bTemp[5]=((p & 0x06)!=0);
bTemp[6]=((p & 0x07)!=0);
bTemp[7]=((p & 0x08)!=0);
return bTemp;
}

funguje to dobre (alebo aspoň sa to tak zdá), ale tak nejak nerozumiem čo robí časť "(p & 0x01)"... z anglického tutoriálu som nepochopil, a pýtať sa učiteľa nemá zmysel...

A ďalšia vec, ako to urobiť opačne - teda z poľa booleanov urobiť 1 byte ?
« Poslední změna: 10. 03. 2014, 16:40:08 od Petr Krčmář »


calverka

Re:java: byte to 8 boolean
« Odpověď #1 kdy: 10. 03. 2014, 16:13:30 »

Quake

Re:java: byte to 8 boolean
« Odpověď #2 kdy: 10. 03. 2014, 16:19:26 »
Urcite to funguje dobre? A nemaji byt ty masky 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80? Pripada me to, ze se sice uci Java, ale nejen, ze tomu nerozumi zak, ale ani ucitel. Co takhle si to otestovat v cyklu pro hodnoty 0 az 255 pro ten byte. Driv se na vyuku programovani pouzival Pascal, ktery tvrde nutil zaky rozumet typum, polim a podobne a jeste umel i kontrolovat preteceni poli a hodnot. Java se na vyuku programovani moc nehodi, ale vsichni v tom jedou a vsichni jsou spokojeni.

Velebnosti...

Re:java: byte to 8 boolean
« Odpověď #3 kdy: 10. 03. 2014, 16:23:31 »
Bych blil...

dušo

Re:java: byte to 8 boolean
« Odpověď #4 kdy: 10. 03. 2014, 16:26:39 »
Urcite to funguje dobre? A nemaji byt ty masky 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80?

jj, mám to zle... co sa tyka pascalu: o tom neviem nič - my sme prebrali uplne základy aj v tej jave (hello world a pod.) toto je nad rámec osnov z mojej vlastnej iniciatívy... učiteľ nema šajnu o IT - minule ho na pol hodinu odpálilo keď si odbehol a spolužiak na jeho pc nechal zoradiť ikonky na ploche podľa názvu...


Re:java: byte to 8 boolean
« Odpověď #5 kdy: 10. 03. 2014, 16:41:06 »
Pokud je něco takového potřeba, použije se třída java.util.BitSet. Nakonec to nejspíš bude i efektivnější, než 8× převádět byte na int.

Radši by vás ve škole měli naučit, že p ani bTemp v tomto případě rozhodně nejsou dobré názvy proměnných, a název metody ByteToBooleanArray začínající velkým písmenem je také dobrý způsob, jak zmást kohokoli, kdo se kolem Javy alespoň mihnul.

Jinak & je bitový AND operátor, na každé dvojici bitů obou operandů udělá logický AND a výsledek určuje hodnotu příslušného bitu výsledku.

Pokud se chcete opravdu naučit základy Javy, doporučuji knížku Učebnice jazyka Java od Pavla Herouta, nic lepšího v češtině asi nevyšlo.

kuka

Re:java: byte to 8 boolean
« Odpověď #6 kdy: 10. 03. 2014, 16:44:39 »
Driv se na vyuku programovani pouzival Pascal, ktery tvrde nutil zaky rozumet typum, polim a podobne a jeste umel i kontrolovat preteceni poli a hodnot. Java se na vyuku programovani moc nehodi, ale vsichni v tom jedou a vsichni jsou spokojeni.

Tak zrovna toto java ma stejne a zde to je nazorne videt - pokud nevim co je byte a neznam operatory, nevyresim ani tuto trivialni ulohu.

Re:java: byte to 8 boolean
« Odpověď #7 kdy: 10. 03. 2014, 18:14:58 »
pokud nevim co je byte a neznam operatory, nevyresim ani tuto trivialni ulohu

A pokud to vím, vyřeším ji špatně. Výsledkem takové výuky bude velká většina lidí, kteří budou mít nesprávný pocit, že programování jsou jakési podivné manipulace s bity a poli, a budou se divit, proč tuhle nudnou rutinu nedělá za člověka počítač. Zbytek budou ti, kteří to pochopí a budou to používat všude, bitové mapy budou používat místo atributů objektů, pole místo kolekcí, a budou umět z voleje naprogramovat quicksort, který nebude fungovat.

Stařešina

Re:java: byte to 8 boolean
« Odpověď #8 kdy: 10. 03. 2014, 19:13:55 »
pokud nevim co je byte a neznam operatory, nevyresim ani tuto trivialni ulohu

A pokud to vím, vyřeším ji špatně. Výsledkem takové výuky bude velká většina lidí, kteří budou mít nesprávný pocit, že programování jsou jakési podivné manipulace s bity a poli, a budou se divit, proč tuhle nudnou rutinu nedělá za člověka počítač. Zbytek budou ti, kteří to pochopí a budou to používat všude, bitové mapy budou používat místo atributů objektů, pole místo kolekcí, a budou umět z voleje naprogramovat quicksort, který nebude fungovat.

Já jsem na Javu přecházel z C a proto mi bitové operace připadají přirozené (kromě té zrady se zachováváním znaménka v Javě). Když se ohlédnu zpátky za C tak uznávám že má svou roli - ale psát v tom velké projekty bych nerad. Myslím si že je třeba znát jak základy (tedy C) tak objektový přístup (Java) a volit to co je třeba. Nedokážu si představit jak asi můžou fungovat "programátoři" kteří se "naučí Javu" ale při dotazu na to jak jsou v paměti uložená data nebo i na to jak naprogramovat quicksort naprosto netuší (pokud se jim zakáže zavolat knihovnu). Ale možná je to jen tím že jsem už moc starý a polodementně blábolím o tom jak je dnešní mládež zkažená...

Pavel Tisnovsky

Re:Java: byte to 8 boolean
« Odpověď #9 kdy: 10. 03. 2014, 19:21:29 »

Kód: [Vybrat]
public static boolean[] ByteToBooleanArray(byte p)
{
boolean bTemp[]=new boolean[8];
bTemp[0]=((p & 0x01)!=0);
bTemp[1]=((p & 0x02)!=0);
bTemp[2]=((p & 0x03)!=0);
bTemp[3]=((p & 0x04)!=0);
bTemp[4]=((p & 0x05)!=0);
bTemp[5]=((p & 0x06)!=0);
bTemp[6]=((p & 0x07)!=0);
bTemp[7]=((p & 0x08)!=0);
return bTemp;
}


Az si tam spravis ty masky (0x01, 0x02, 0x04...), tak bych doporucoval si to v ramci treningu prepsat do smycky, protoze jestli dalsi uloha bude naprogramovat longToBooleanArray(), tak uz to bude vypadat silene :)

Hint: pouzijes porad maskovani s 0x01 a potom bitovy posun doprava.

hmmm

Re:Java: byte to 8 boolean
« Odpověď #10 kdy: 10. 03. 2014, 19:30:24 »
Popravde receno, operator "&" jsem uz nekolik mesicu nepouzil, zatimco "&&" pouzivam bezne.

Velmi strucne a laicky pro puvodniho tazatele:
"&" je bitovy soucin. Tzn. tam kde je v promenne A i v promenne B na stejne pozici jednicka, tak bude ve vysledku taky jednicka.
Napr. (obecny jazyk typu C):
promennaA = 0b00110011;
promennaB = 0b01000110;
vysledek = promennaA & promennaB;  /// melo by byt: 0b00000010

Kdybys nevedel, jak slozit bajt z osmi bitu, tak doporucuji "Uz vim proc, 2. dil"  :)

RAII

Re:Java: byte to 8 boolean
« Odpověď #11 kdy: 10. 03. 2014, 19:47:20 »
No, já si myslím že s úsporou pár bajtů na booleanech v javě díru neuděláš. V javě která má žravej GC, a na stacku nic neukládá (něco asi jo, nestudoval sem to víc, nezajímá mne). Takovíhle hraní si s bitama je třeba pouze u low level vývoje (nastavování příznaků v registrech a tak podobně). BTW, když si s tím chceš hrát, napřed si nastuduj binární soustavu a binární operátory, jinak fakt na profesora dojem neuděláš (vysvětli...), z netu to umí zkopírovat každej (v tvým případě ještě blbě). Jinak, proč mám dojem že na školách sou vymaštěný profesoři?

Pavel Tisnovsky

Re:Java: byte to 8 boolean
« Odpověď #12 kdy: 10. 03. 2014, 20:13:00 »
Kdybys nevedel, jak slozit bajt z osmi bitu, tak doporucuji "Uz vim proc, 2. dil"  :)

Mas pravdu, jsem se ted dival do druheho dilu (ktery mi uz davno znarodnil nas mladej pan :-) a skutecne to tam popisuji...

Re:java: byte to 8 boolean
« Odpověď #13 kdy: 10. 03. 2014, 20:18:10 »
Nedokážu si představit jak asi můžou fungovat "programátoři" kteří se "naučí Javu" ale při dotazu na to jak jsou v paměti uložená data nebo i na to jak naprogramovat quicksort naprosto netuší (pokud se jim zakáže zavolat knihovnu).
Řekl bych, že podobně, jako fungují řidiči, kteří neumí osedlat koně. Akorát podíl profesionálních programátorů, kteří dnes musí znát způsob uložení dat v paměti, bude dnes pořád ještě víc, než profesionálů, kteří se zabývají koňmi.

Stařešina

Re:Java: byte to 8 boolean
« Odpověď #14 kdy: 10. 03. 2014, 20:33:32 »
No, já si myslím že s úsporou pár bajtů na booleanech v javě díru neuděláš. V javě která má žravej GC, a na stacku nic neukládá (něco asi jo, nestudoval sem to víc, nezajímá mne). Takovíhle hraní si s bitama je třeba pouze u low level vývoje (nastavování příznaků v registrech a tak podobně).

Sice se v Javě ty bitové operace nepoužívají nijak extrémně často, ale už jsem optimalizoval dvourozměrné pole booleanů za jednorozměrné pole BitSet, používalo se to totiž v rekurzivním algoritmu a prováděly se tam kopie, takže optimalizace program změnila z nepoužitelně pomalého na rozumně rychlý.

Další reálné použití jsem viděl pri parsování binárního protokolu který byl daný a nebylo ho možné změnit protože ho používala krabice (blackbox) od neflexibilního dodavatele.

Takže nevidím důvod proč by programátor v Javě neměl chápat bitové operace.

K tomu žravému GC - Java má naopak velmi efektivní GC. Připomínám že jde o zkratku Garbage Collector, takže vzhledem k tomu že programátor má plně pod kontrolou kolik vytváří toho Garbage tak když programuje efektivně, GC nezatěžuje a program mu pak běhá velmi rychle. Když programátor nepřemýšlí a tvoří spoustu Garbage tak mu pak nezbývá než se vymlouvat na neefektivní GC.

Formulaci "Java na stacku nic neukládá (něco asi jo, nestudoval sem to víc, nezajímá mne)" radši nechám bez komentáře.

BTW, když si s tím chceš hrát, napřed si nastuduj binární soustavu a binární operátory, jinak fakt na profesora dojem neuděláš (vysvětli...), z netu to umí zkopírovat každej (v tvým případě ještě blbě). Jinak, proč mám dojem že na školách sou vymaštěný profesoři?

100% souhlas, kdyby mi někdo k zápočtu nebo na zkoušku přinesl tohle tak si ho pěkně vychutnám. Je naprosto evidentní že vůbec netuší co v tom programu je napsáno a co hůř: ani ho to nezajímá, vůbec to nemá otestované a naprosto mu není blbé to do toho programu dát! Copy&paste "programování" jako náhrada přemýšlení je příšernost kterou je třeba potírat kdykoliv a kdekoliv!