Operazioni bit to bit con formule di Excel

posted Mar 20, 2012, 4:18 PM by r   [ updated Mar 21, 2012, 8:00 AM ]
Gli operatori logici in VBA se utilizzati tra due espressioni numeriche eseguono un confronto bit to bit tra i bit collocati nella stessa posizione, impostando i bit corrispondenti del risultato. A seconda dell'operazione (o se preferite dell'operatore) e ... a seconda dei valore del bit, il risultato verrà impostanto seguendo le regole riportate in questa tabella:

Expression_1 Expression_2 AND OR XOR IMP EQV
0 0 0 0 0 1 1
0 1 0 1 1 1 0
1 0 0 1 1 0 0
1 1 1 1 0 1 1

In Excel gli operatori logici sono rappresentati dalle funzioni E,O,NON (AND, OR, NOT) che vengono utilizzate esclusivamente per operazioni logiche tra due o più espressioni. Non esiste quindi un comportamento di confronto tra bit come nelle corrispondenti funzioni VBA.

Ho voluto scrivere delle formule che svolgessero questo lavoro. Non è stata una reale necessità, solo una sfida interessante e divertente che ancora una volta mostra la potenza delle formule matriciali in Excel.

Nel file (scaricabile dal fondo della pagina) troverete anche le formule per le operazioni di Shift (right e left) e Rotate (right e left) che non hanno operatori specifici neppure in VBA.


Qui sotto le formule utilizzate nel file. Usano tutte 3 nomi definiti:
Exp_1 e Exp_2 rappresentano le due espressioni numeriche oggette del confronto mentre bits è il numero di bit su cui viene eseguito il confronto.

AND

=SOMMA(RESTO(INT(Exp_1/2^(RIF.COLONNA(bits)-1));2)*RESTO(INT(Exp_2/2^(RIF.COLONNA(bits)-1));2)*2^(RIF.COLONNA(bits)-1))

=SUM(MOD(INT(Exp_1/2^(COLUMN(bits)-1)),2)*MOD(INT(Exp_2/2^(COLUMN(bits)-1)),2)*2^(COLUMN(bits)-1))


OR

=SOMMA(SE(RESTO(INT(Exp_1/2^(RIF.COLONNA(bits)-1));2)+RESTO(INT(Exp_2/2^(RIF.COLONNA(bits)-1));2);2^(RIF.COLONNA(bits)-1)))

=SUM(IF(MOD(INT(Exp_1/2^(COLUMN(bits)-1)),2)+MOD(INT(Exp_2/2^(COLUMN(bits)-1)),2),2^(COLUMN(bits)-1)))


XOR

=SOMMA(SE(RESTO(INT(Exp_1/2^(RIF.COLONNA(bits)-1));2)-RESTO(INT(Exp_2/2^(RIF.COLONNA(bits)-1));2);2^(RIF.COLONNA(bits)-1)))

=SUM(IF(MOD(INT(Exp_1/2^(COLUMN(bits)-1)),2)-MOD(INT(Exp_2/2^(COLUMN(bits)-1)),2),2^(COLUMN(bits)-1)))


IMP

=SOMMA(SE(RESTO(INT(Exp_1/2^(RIF.COLONNA(bits)-1));2)-RESTO(INT(Exp_2/2^(RIF.COLONNA(bits)-1));2)-1;2^(RIF.COLONNA(bits)-1))-2^(RIF.COLONNA(bits)-1))-1

=SUM(IF(MOD(INT(Exp_1/2^(COLUMN(bits)-1)),2)-MOD(INT(Exp_2/2^(COLUMN(bits)-1)),2)-1,2^(COLUMN(bits)-1))-2^(COLUMN(bits)-1))-1


EQV

=SOMMA((RESTO(INT(Exp_1/2^(RIF.COLONNA(bits)-1));2)=RESTO(INT(Exp_2/2^(RIF.COLONNA(bits)-1));2))*2^(RIF.COLONNA(bits)-1)-2^(RIF.COLONNA(bits)-1))-1

=SUM((MOD(INT(Exp_1/2^(COLUMN(bits)-1)),2)=MOD(INT(Exp_2/2^(COLUMN(bits)-1)),2))*2^(COLUMN(bits)-1)-2^(COLUMN(bits)-1))-1


SHIFT LEFT

=INT(SOMMA(RESTO(INT(Exp_1/2^(n_bit-RIF.COLONNA(bits)-1));2)*2^(n_bit-RIF.COLONNA(bits))))

=INT(SUM(MOD(INT(Exp_1/2^(n_bit-COLUMN(bits)-1)),2)*2^(n_bit-COLUMN(bits))))


SHIFT RIGHT

=INT(SOMMA(RESTO(INT(Exp_1/2^(n_bit-RIF.COLONNA(bits)+1));2)*2^(n_bit-RIF.COLONNA(bits))))

=INT(SUM(MOD(INT(Exp_1/2^(n_bit-COLUMN(bits)+1)),2)*2^(n_bit-COLUMN(bits))))


ROTATE LEFT

=SOMMA(RESTO(INT(Exp_1/2^(n_bit-RESTO(RIF.COLONNA(bits);n_bit)-1));2)*2^(COLONNE(bits)-RIF.COLONNA(bits)))

=SUM(MOD(INT(Exp_1/2^(n_bit-MOD(COLUMN(bits),n_bit)-1)),2)*2^(COLUMNS(bits)-COLUMN(bits)))


ROTATE RIGHT

=SOMMA(RESTO(INT(Exp_1/2^RESTO(n_bit-RIF.COLONNA(bits)+1;n_bit));2)*2^(COLONNE(bits)-RIF.COLONNA(bits)))

=SUM(MOD(INT(Exp_1/2^MOD(n_bit-COLUMN(bits)+1,n_bit)),2)*2^(COLUMNS(bits)-COLUMN(bits)))


Link

IT
http://msdn.microsoft.com/it-it/library/wz3k228a%28v=vs.80%29.aspx
http://it.wikipedia.org/wiki/Algebra_di_Boole
http://it.wikibooks.org/wiki/C/Variabili,_operatori_e_costanti/Operatori_sui_bit
EN
http://en.wikipedia.org/wiki/Bitwise_operation


Ĉ
r,
Mar 20, 2012, 4:18 PM
Comments