Newsgroup: it.comp.java
Titolo: bit-wise

Sapreste consigliarmi letture o comunque un percorso specifico per capire
esattamente come e perche' usare
gli operatori di shift e relative maschere ?
Ci sono dei progetti sviluppati in java che fanno uso intensivo di tali
logiche?
Grazie
A.

logiche?
Gli algoritmi di compressione o codifica sicuramente li usano.
Sul mio sito (ormai quasi abbandonato lě) c'č un progettino che li usa
molto, č un codificatore di paritŕ.
-- 
_____________________
RedPelle
--==--==--==--==--==--==--
 
redp...@email.it
 
www.redpelle.cjb.net
--==--==--==--==--==--==--

logiche?
Gli algoritmi di compressione o codifica sicuramente li usano.


logiche?
Gli algoritmi di compressione o codifica sicuramente li usano.


 gli operatori di shift e relative maschere ?
Il "come" lo trovi sulla documentazione.
Il "perche'" e', al solito, un po' meno evidente. Senza pretendere di 
essere esauriente, eccotene alcuni:
- implementare operazioni che sono inerentemente bit-a-bit, cioe' sono 
definite su bit. Esempio tipici si trovano nella manipolazione di immagini, 
ma ce ne sono anche altri (molta crittografia, ad esempio, lavora su stream 
di bit - cioe' gli algoritmi sono definiti direttamente su stream di bit).
- implementare operazioni che non sono inerentemente bit a bit in modo piu' 
efficiente. Questo aspetto arriva dall'assembler e dalla programmazione a 
basso livello, e dal fatto che nei computer soliti le rappresentazioni 
degli interi sono binarie: ad esempio, moltiplicare/dividere per due si 
puo' fare con un'operazione x=x*2; oppure con uno shift a sinistra. Ad 
esempio, che so, 1101 (8+4+1=13 decimale) diventa 011010 (16+8+2=26 
decimale). Oppure azzerare un valore, che si puo' fare con un assegnamento 
(x=0) oppure uno XOR con se stesso (x^=x). Ora, su molte architetture 
hardware la versione bitwise (usata scrivendo in codice macchina, 
intendiamoci) e' molto piu' veloce di quella che fa usa di un operatore, 
specialmente sui registri. Quindi programmatori che ne hanno fatto uso, 
talvolta riusano questi idiomi anche ad alto livello, o perche' 
gli operatori del linguaggio mappano da vicino le caratteristiche del 
codice macchina (tipo il C, anche se e' sempre meno vero man mano gli 
ottimizzatori diventano piu' efficaci) oppure come "hint" 
all'ottimizzatore, oppure semplicemente perche' anche ad alto livello il 
codice oggetto (compilato) risulta piu' veloce, oppure perche' sono 
abituati a far cosi (e magari un po' blase' :). In Java, sinceramente, non 
saprei, ma e' facilissimo provare a vedere.
- implementare variabili mantenendo la certezza dello spazio usato, oppure 
usando uno stile di programmazione che non vuole molte diverse variabili 
per mantenere i vari pezzi di stato "booleani". Ad esempio, immagina le 
opzioni per un certo programma: "-verbose", "-debug", "-
modoDiFunzionamentoUno" "-modoDiFunzionamentoDue".. tipicamente 16 valori 
booleani si impacchettano benissimo in un intero i - inserendoli e 
estrendoli via maschere (ad esempio, se il bit per "verbose" e' il terzo, 
basta avere una costante VERBOSE = 4 - 4 essendo la terza potenza di due - 
e il test per "verbose" e' un semplice "if (i & VERBOSE)...". A questo 
proposito, in Java, c'e' la classe BitSet che ti evita pure di scrivere le 
operazioni a mano.
Cio' ha molto senso in linguaggi che non hanno un tipo boolean, che il 
progammatore "junior" sostituisce con un char (spendendo 8bit per usarne 
1). Meno senso se ce l'hanno; pero' anche li' i type system dei vari 
linguaggi tendono spesso ad essere "opachi" (e giustamente) sull'effettiva 
*rappresentazione* di un tipo (l'assunzione che il 
compilatore/ottimizzatore usi un bit per un boolean puo' o non puo' essere 
vera) - usare bit direttamente ad alto livello ti permette maggiore 
controllo.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun