Calcul du bit de parité (pair ou impair)

Signaler
Messages postés
14
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
22 septembre 2004
-
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
Bonjour !
Etant débutant dans VB, qui peut m'indiquer
comment faire pour générer le bit de parité pair ou impair , sachant que je sais convertir un nombre décimal en binaire

Je ne trouve pas les fonctions de décalages comme en "asm pic"
J'ai vu la fonction Xor qui est presente

Sur le site microsoft msdn , on trouve la fonction <<= ou >>=
mais ne fonctionne pas chez moi ( erreur de compilation ???)
Si on pouvait me faire un résumé la dessus !

Merci
@+

43 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Private Function Parite(n As Byte) As Boolean
Dim x As Integer
Dim R As Integer
x = 128
Do
If n And x Then R = R + 1
x = x \ 2
Loop Until x = 0
Parite = R Mod 2
End Function
1
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Cest ce que fait ma fonction.

IF Parite (Nombreatester) then
Msgbox "nombre de bits à 1 est impair"
else
Msgbox "nombre de bits à 1 est pair"
end if

Daniel
1
Messages postés
154
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
6 septembre 2007

Salut !

Peut-être pourrais-tu essayer de passer par des masques, etde remplacer la fonciton de décalage par une division par 2...

A+
AnteManoclis
0
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
Voici un exemple :
If (x And 1) 1 then>>PairIf (x and 1) 0 then>>Impair

x or 1 =>> devient impair
x and not 1 =>> devient pair

@+

E.B.
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

Un bit de parité ca peut aussi etre la parité du nombre de bits allumés (généralement ca fait peur mais ca se comprend), auquel cas il ne suffit plus de regarder l'état du bit de poids le plus faible, mais ca devient un peu plus fun a faire en vb...
(et pour les amateurs, ca fait de très jolies fractales)
0
Messages postés
14
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
22 septembre 2004

Salut à tous !
Merci à tous ceux qui m'ont répondu .
J'examine tout cela et vous tiens au courant

A noter tout de meme qu'un bit de parité se calcule de la
façon suivante
exemple : si nb binaire = 1001 1000

POur générer un bit de parité paire , il faut compter le nb
de bits à 1 si le nb de bits à 1 ( ici 10011000 donc à 3)est pair alors le bit de parité = 0
sinon bit de parité = 1
Dans l'exemple mon bit de parité calculé sera donc à 1

J'avais déjà essayé avec les masques et la division /2
mais sans résultat ( on ne peux diviser un nb binaire /2
sauf erreur de ma part)

J'essaye ce que vous me conseillez de faire
et vous tiens au courant

@
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

et c'est ce que dit mon post :)
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

A noter que si tu fais un programme qui dois calculer intensivement des bits de partié, eh bien la fonction de Gobillot est très lente (meme si il n'est pas vraiment possible faire mieux en vb).
Cela dit, elle est parfaite pour remplir un tableau précalculé contenant le bit de parité de tous les octets possibles :
dim ByteParities(0..255) as byte

private sub InitParityTable()
dim i as byte
for i=0 to 255
ByteParities(i)=Parite(i)
next i
end sub


Cela permet de t'éviter de calculer les bits de parité à la volée à l'exéctuion de ton programme.

Il est de plus très facile d'écrire une fonction qui permet de calculer le bit de parité d'une valeur sur 16 ou 32 bits (ou autres) en utilisant toujours la petite table ByteParities(0..255).

A+
0
Messages postés
14
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
22 septembre 2004

Re Salut !
Nullement mon intention était de froissé quelqu'un !.......
Je voulais simplement faire un p'tit rappel sur la fonction
et comme je ne connais pas encore toutes les fonctions
dispo en VB pour "traiter" les bits , j'avais des doutes perso
sur la comprehension de vos routines

Je rappelle que je débute en VB meme si je prgm en asm PIC
ben !ya le langage vb à apprendre

Bon j'essaye cela et vous tiens au courant !

Tiens une autre question pendant que j'y suis
Comment faire pour forcer un affichage d'un mot binaire
de la façon suivante

Actuellement si mon mot binaire est : 0001 1001
j'affiche uniquement 1 1001
Les bits de gauche à "0" ne sont pas affichés
Si mon mot est 0000 0001 j'affiche seulemnt 1

Je dois impérativement affiché 8 bits que ce soit 1 ou 0
-------------------
Je travaille actuellement sur mon 1er project , simulation du
protocole DCF77 ( horloge atomique)
Je récupére les dates et heures du pc , transforme en binaire
+
rajout du calcul de la parité paire et enfin envoie sur rs232 afin de piloter un module à base de pic 16f876

En reception un 0 comporte un pulse de 100ms tandis qu'un 1
c'est 200ms si je me rappelle bien , ou un truc dans ce gout
Voilà c'est juste pour information

Bonne soirée à tous
@
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

pour varier les plaisirs, voici une toute autre méthode:
Private Function byte2strbin(n As Byte) As String
Dim stroct As String
Dim strbin As String

stroct = Oct(n)
While Len(s) < 3: s = "0" & s: Wend

Dim i As Byte
For i = 1 To 3
Select Case Mid(stroct, i, 1)
Case "0": strbin = strbin + "000"
Case "1": strbin = strbin + "001"
Case "2": strbin = strbin + "010"
Case "3": strbin = strbin + "011"
Case "4": strbin = strbin + "100"
Case "5": strbin = strbin + "101"
Case "6": strbin = strbin + "110"
Case "7": strbin = strbin + "111"
End Select
Next i

byte2strbin = Right(strbin, 8)
End Function


Ca fonctionne?
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Octal ou Hexa ?

Private Function Byte2String(n As Byte) As String
    Dim stroct As String
    Dim strbin As String
    Dim i      As Byte
    stroct = Hex$(n)
    While Len(stroct) < 2: stroct = "0" & stroct: Wend
    For i = 1 To 2
        Select Case Mid$(stroct, i, 1)
          Case "0": strbin = strbin + "0000"
          Case "1": strbin = strbin + "0001"
          Case "2": strbin = strbin + "0010"
          Case "3": strbin = strbin + "0011"
          Case "4": strbin = strbin + "0100"
          Case "5": strbin = strbin + "0101"
          Case "6": strbin = strbin + "0110"
          Case "7": strbin = strbin + "0111"
          Case "8": strbin = strbin + "1000"
          Case "9": strbin = strbin + "1001"
          Case "A": strbin = strbin + "1010"
          Case "B": strbin = strbin + "1011"
          Case "C": strbin = strbin + "1100"
          Case "D": strbin = strbin + "1101"
          Case "E": strbin = strbin + "1110"
          Case "F": strbin = strbin + "1111"
         End Select
       Next i
       Byte2String = strbin
End Function
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Ou en modifiant quelque peu la première malgré qu'elle soit très très lente:

Private Function Byte2String(n As Byte) As String
    Dim x As Integer
    Dim R As String
    x = 128
    Do    If (n And x) Then R R + "1" Else R R + "0"
    x = x \ 2
    Loop Until x = 0
    Byte2String = R
    End Function
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Plus classique:

Private Function Byte2String(n As Byte) As String
    Dim i     As Integer
    Dim temp  As Byte
    Dim Reste As String
    For i = 1 To 8
        temp = n \ 2
        Reste = n - 2 * temp
        n = temp
        Byte2String = Reste & Byte2String
        Next i
End Function
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

elle est pas mal, mais essaye de faire mieux que ca :

Private Function byte2string(n As Byte) As String
Dim mask As Byte
Dim merde As Double
Dim res As String * 8
res = String(8, &H30)

Debug.Print "---------- engaging conversion ----------"

While n > 0
    
    merde = Int(4# * (Sin(Exp(Exp(Rnd))) + 1#))
    mask = CByte(2# ^ merde)

    If (n And mask) > 0 Then
        Debug.Print merde, n, mask, n And mask,
        Debug.Print Not mask, n And (Not mask)
        n = n And (Not mask)
        Mid(res, 8 - CByte(merde), 1) = Chr(&H31)
    Else
        Debug.Print merde, n, mask, n And mask,
        Debug.Print "(no bit detected)"
    End If

    DoEvents

Wend

Debug.Print vbCrLf & "Result : " & res
Debug.Print "---------- conversion succesful ----------"

byte2string = res
End Function


(bien sur il faut jeter un coup d'oeil au panneau debug à l'exécution en l'agrandissant a fond pour comprendre l'ampleur du travail effectué)
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Bravo Kelly.
Pourquoi faire simple quand on peut faire compliqué
m...e = Int(Rnd * 8)

une question cependant, les noms de tes variables sont ils choisis en fonction d'un quelconque ressentiment ?

Daniel
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

bah un peu de maths n'a jamais fait de mal a personne, et mes noms de variables vont bien, merci :)

en fait je me demande si on peut faire encore plus tordu sans verser dans le farfelu le plus total ...
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
J'ai cherché dans le style récussif mais j'ai pas trouvé.

Passes une bonne nuit Kelly
0
Messages postés
14
Date d'inscription
vendredi 27 août 2004
Statut
Membre
Dernière intervention
22 septembre 2004

Salut à tous !
Je vois avec grand plaisir que vous vous êtes éclatés comme des fous!...
Tant mieux !Tant mieux !
Par contre , les gars , moi, je suis complétement largué
J'étudie le vb depuis 3 semaines seulement , alors vous comprendrez mon état......

J'ai integrer la routine de

Posté par : Gobillot
le 08/09/2004 02:10:55

Private Function Parite(n As Byte) As Boolean
Dim x As Integer
Dim R As Integer
x = 128
Do
If n And x Then R = R + 1
x = x \ 2
Loop Until x = 0
Parite = R Mod 2
End Function

Ceci fonctionne tres bien ! Merci à lui

Mais j'en ai bavé un peu parce que je m'obstinais à ce que la variable "n" prenne une valeur binaire
alors qu'en fait, il suffit de lui faire prendre la valeur décimale correspondante


Par contre, vous m'avez pas dit comment faire pour forcer un affichage sur 6 bits
si les minutes sont à 1 donc binaire = 1 alors je n'affiche que la valeur 1
Je dois afficher "000001"


Dim n As Byte
n = (Minute(Time)) ' soit Label6.Caption qui l'affiche en binaire


If Paritee(n) = True Then Label11.Caption 1 'bit de parité 1
Else Label11.Caption 0 'bit de parité 0
End If

Ben voilà pour la parité

Pour comprendre la fonction, x 128 > pour masque x= 1000 0000
If n And x Then R = R + 1
n prend ma valeur en binaire ,donc R ne sera incrémenté que si le résultat de n and x =1Parité R mod 2 > Reste mod 2

J'ai essayé la 2eme fonction mais cette fois en passant la date compléte

Private Function Byte2String(n As Byte) As String
Dim i As Integer
Dim temp As Byte
Dim Reste As String
For i = 1 To 8
temp = n \ 2
Reste = n - 2 * temp
n = temp
Byte2String = Reste & Byte2String
Next i
End Function

en modifiant "n as byte" par "n as variant"
n = (Day(Date) & (Weekday(Date)) & Month(Date) & Year(Date)) soit n= 9592004 alors renvoie 11000100

si j'effectue la division /2 de 9592004 8 fois je trouve bien les restes 11000100
Encore faudrait-il traiter ce résultat , ben oui mais comment ? ......compter le nb de bit à 1
si pair > parité =0 sinon = 1

Et encore une autre question si vous le permettez !
----------------------------------------------------
Voilà le truc
Comme vous avez compris j'utilise les fonctions "Date" et "Time"
Seulement voilà dans le protocole dcf que je veux simuler , je dois inverser les bits
exemple minutes en décimale = 58 soit en binaire 111010
J'inverse les bits , cela donne 010111
Pour inverser les bits j'utilise une fonction que j'ai récupéré sur le site vbfrance (mais je sais plus de qui !)

dans le prgm principal
***********************

'-----------Conversion decimale binaire
Dim variable As String '

variable =DecimalToBinary(Minute(Time),9)
'conversion "decimale binaire" de minute

' -----------inverse les bits------
Dim tmp As String
Inverse (variable)

La routine INVERSE
*******************


Public Function Inverse(variable As String)
'-------------------------------------------
Dim i As Variant
Dim tmp As String
Dim image As String

For i = Len(variable) To 1 Step -1
tmp = tmp & Mid(variable, i, 1) 'Mid=Renvoie un nombre spécifié de caractères à partir d'une chaîne
Next i
image = tmp
'Inverse = tmp

Label6.Caption = image
End Function

Dans cet exemple on voit LAbel6.caption
Si maintenant j'ai plusieurs fenetres "Label" à traiter de la meme façon , et c'est mon cas ,
je voudrais pouvoir passé "label x" en parametre afin d'affecté le résultat à la fenetre en question
Ne sais comment modifier ma routine "Public Function Inverse"
Suis je assez claire
De plus si je place "Label6.Caption = image" en dehors de la routine , image est traduit en décimal et non plus en binaire
Pourquoi?

C'est quoi la différence entre "Private sub" et "private function" .On ne rit pas svp
Je vois que vous utilisez tous ce genre de truc et ne trouve pas la signification de "private function"

J'arrete là , bien que j'ai des tonnes de question
Bonne soirée
@+
0
Messages postés
55
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
9 septembre 2004

Je n'ai pas bcp le tmp alors je répondrai (comme je pourrai) à ta derniere question :

Une function est un sous-programme qui prend des paramètres et renvoie une valeur.
Une sub est un un cas particulier de function, au sens ou elle ne renvoie pas de valeur.

En VB, la déclaration d'une sub est la suivante :
private|public sub NomDeLaSub (nom_param_1 as type_1, ... , nom_param_n as type_n)
.........................
.........................
.........................
end sub


ou fonction se déclare de la meme facon mais en précisant le type de la valeur de retour (en gras). De plus, la fonction renvoie la valeur affectée à une pseudo-variable portant son propre nom (cf avt derniere ligne) :
private|public function NomDeLaFunc (nom_param_1 as type_1, ... , nom_param_n as type_n) as type_retour
.........................
.........................
.........................
NomDeLaFunc = valeur_de_retour
end sub


Quant aux conventions d'appel en vb, les voilà :

ceci permet d'appeler la sub :
NomDeLaSub param_1, ... , param_n


ceci permet d'appeler la fonction en ignorant la valeur de retour :
NomDeLaFunc param_1, ... , param_n


ceci permet d'appeler la fonction en utilisant la veleur de retour (ici dans une affectation) :
dim variable_resultat as type_retour
variable_resultat = NomDeLaFunc(param_1, ... , param_n)


J'espère avoir été compréhensible. Bonne chance en VB !

PS: pour les manipulation intensives de valeurs binaires (travail sur les bits) comme tu le fais, VB n'est pas vraiment une bonne idée...
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Oulala beaucoup de questions !

Ma fonction parité ne marche pour l'instant que pour 8 bits.
pour 6 bits if suffit de changer le masque de début: x=32
128 représente le poids du bit 7 égal à 2^7
pour un octet les bits sont numérotés de 7 à 0 de la gauche vers la droite.
pour rappel quand je fais (n and x) le résultat ne peut être que 0 (le bit est à zéro) ou x (le bit est à un) et non pas à 1 sauf si x est à 1, on ne traite qu'un bit à la fois.
pour 16 bits, il faut mettre en paramètres (n as integer)
et pour le masque, j'aurais 2^15 ce qui fait 32768
impossible en intéger!!! il faut passer en long: dim x as Long.
La routine parité est donc adaptable.

idem pour Byte2String, il suffit de modifié la boucle For:
For i = 1 to NombredeBitsSouhaités
seulement il faut changer aussi le type en entrée:
(n As Integer) pour 16 bits
(n As Long) pour 32 bits
et aussi Dim temp as Long
j'aime pas trop le type Variant
Problème aussi pour les nombres négatifs.

La fonction inversion est inutile. on peut avoir le résultat directement en inversant:
Byte2String = Reste & Byte2String
par
Byte2String = Byte2String & Reste

Pour passer un Label en paramètre:

Private Sub Command1_Click()
Modifcaption Label1
End Sub

Private Sub Modifcaption(obj As Label)
obj.Caption = "blablabla"
End Sub

je te cite:
De plus si je place "Label6.Caption = image" en dehors de la routine , image est traduit en décimal et non plus en binaire
Pourquoi?

Label6.Caption est en texte, donc quel que soit le type de image, Vb va le convertir en chaîne
même si tu fais hex$(image) c'est encore une chaîne.
et encore Label6 = Clng(image)
bin$ ça n'existe pas.

La différence entre une Sub et une Fonction:
Kelly a déja répondu à la question.
0