Dopo avere incontrato alcune difficoltà scrive un po contrariato:
> P.S. se penso che in C è così semplice calcolare la parità bit a bit ... ;-))La cosa mi ha incuriosito, e poi oggi è l'8 marzo e la parità è l'argomento del giorno!! :-)
> solo che poi non avrei tutte le altre comodità di Calc.
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)La traduzione in Basic è banale.
//--------------------------------unsigned int v; // word value to compute the parity ofbool parity = false; // parity will be the parity of v
while (v){parity = !parity;v = v & (v - 1);}//--------------------------------
'__________________________________________________________________________Per poter adattare la funzione all'uso nel foglio di calcolo però occorre fare un ulteriore passaggio:
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
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:
'__________________________________________________________________________Paolo Mantovani
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
Nessun commento:
Posta un commento