giovedì 8 marzo 2012

Otto Marzo

Valerio, un utente della mailing list italiana di OpenOffice.org sta scrivendo del codice StarBasic per calcolare la parità di un numero.
Dopo avere incontrato alcune difficoltà scrive un po contrariato:
> P.S. se penso che in C è così semplice calcolare la parità bit a bit ... ;-))
> solo che poi non avrei tutte le altre comodità di Calc.
La cosa mi ha incuriosito, e poi oggi è l'8 marzo e la parità è l'argomento del giorno!! :-)
Oltre a questo, ovviamente c'è il sapore della sfida.
Ben sapendo che StarBasic è il linguaggio più potente dell'universo ;) non posso accettare che si sostenga che con il linguaggio C codificare  la tal cosa sarebbe più semplice o più efficace eccetera eccetera...
Dunque vediamo un po di cosa si tratta:
secondo wikipedia:
Il bit di parità è un codice di controllo utilizzato nei calcolatori per prevenire errori nella trasmissione o nella memorizzazione dei dati.
In sostanza, si vanno a contare i bit alzati in un pacchetto di dati e si verifica se il numero risultante è pari o dispari.
In C esistono diversi metodi, ma questo mi è sembrato molto brillante:
Computing parity (1 if an odd number of bits set, 0 otherwise)
//--------------------------------
unsigned int v;       // word value to compute the parity of
bool parity = false;  // parity will be the parity of v

while (v)
{
  parity = !parity;
  v = v & (v - 1);
}
//--------------------------------
La traduzione in Basic è banale.
'__________________________________________________________________________
Function Parity(v As Long) As Boolean
Dim p As Boolean' parity will be the parity of v

    While (v)
      p = Not p
      v = v And (v - 1)
    Wend
    Parity = p

End Function
Per poter adattare la funzione all'uso nel foglio di calcolo però occorre fare un ulteriore passaggio:
A livello del foglio di calcolo infatti, non esiste un vero e proprio tipo di dato booleano.
Le funzioni di Calc che restituiscono valori booleani in realtà restituiscono un intero: 0 corrisponde a FALSO e 1 corrisponde a VERO
Esiste poi un formato numerico booleano che mostra il valore 0 come FALSO e qualsiasi altro valore come VERO
Perciò, per una migliore compatibilità con il foglio elettronico è opportuno modificare la funzione come segue:
'__________________________________________________________________________
Function Parity(v As Long) As Integer
Dim c As Long    ' c accumulates the total bits set in v
    While v
        c = c + 1
        v = v And  (v - 1) ' clear the least significant bit set
    Wend
    Parity =  c Mod 2
   
End Function
Paolo Mantovani