OVH Cloud OVH Cloud

Manipulations Bit - String

6 réponses
Avatar
xx
Bonjour

J'ai le probleme suivant:
-une petite centaine de messages d'erreur/information differents (arrondissons a 128 ...)
-Plusieurs indicateurs d'erreur peuvent etre excites simultanement

J'ai donc dans le programme un tableau de booleans, chacun correspondant a une erreur.
Dim aErr(128) As Boolean

Je voudrais passer a une representation plus condensee (disque) ou chacun des bits d'une chaine de caracteres fixe est representatif
de l'erreur.
Dim sErr As String *16

Je n'arrive pas a trouver de codes operation manipulant simplement les bits.
Je recherche des morceaux de code me permettant de passer de la representation tableau a la representation chaine, et vice-versa

Merci

6 réponses

Avatar
Christophe
Salut,

je sais pas si ça répond à tes besoins, voilà un exemple que j'utilise sur
une feuille où 6 checkbox peuvent être activés ou desactivé je stock la
valeur des combinaisons dans un entier
donnee(i) est le nom du checkbox

Private Sub Command1_Click()
Dim a(5) As Integer
For i% = 0 To 5
a(i%) = donnee(i%).Value
Next i%
formatdonnees = bintodec(a())
Unload Me

End Sub

Private Sub Command2_Click()
Unload Me
End Sub


Private Sub Form_Load()
convert formatdonnees, 5
For i% = 1 To 5
Me.donnee(i%).Value = resultatdeconvert(i%)
Next i%
End Sub

Public resultatdeconvert() As Integer
Public formatdonnees As Integer

Public Function bintodec(ar() As Integer) As Integer
Dim a As Integer
For i% = 0 To UBound(ar())
If ar(i%) = 1 Then
a = a + 2 ^ i%
End If
Next i%
bintodec = a
End Function

Public Sub convert(n As Integer, limite As Integer)
Dim i, r As Integer

i = 0
Do While n 2 ^ i > 1
i = i + 1
Loop
ReDim resultatdeconvert(limite)
resultatdeconvert(i) = 1
If i < limite Then
For j% = i + 1 To limite
resultatdeconvert(j) = 0
Next j%
End If
r = n Mod 2 ^ i
Do Until i = 0
If r 2 ^ (i - 1) = 1 Then
resultatdeconvert(i - 1) = 1
Else
resultatdeconvert(i - 1) = 0
End If
i = i - 1
r = r Mod 2 ^ i
Loop

End Sub

christophe vergon

"xx" a écrit dans le message de news:

Bonjour

J'ai le probleme suivant:
-une petite centaine de messages d'erreur/information differents


(arrondissons a 128 ...)
-Plusieurs indicateurs d'erreur peuvent etre excites simultanement

J'ai donc dans le programme un tableau de booleans, chacun correspondant a


une erreur.
Dim aErr(128) As Boolean

Je voudrais passer a une representation plus condensee (disque) ou chacun


des bits d'une chaine de caracteres fixe est representatif
de l'erreur.
Dim sErr As String *16

Je n'arrive pas a trouver de codes operation manipulant simplement les


bits.
Je recherche des morceaux de code me permettant de passer de la


representation tableau a la representation chaine, et vice-versa

Merci




Avatar
xx
"Christophe" a écrit dans le message de news:bl0ut7$iv1$
"xx" a écrit dans le message de news:




J'ai le probleme suivant:
-une petite centaine de messages d'erreur/information differents
(arrondissons a 128 ...)
-Plusieurs indicateurs d'erreur peuvent etre excites simultanement

J'ai donc dans le programme un tableau de booleans,
chacun correspondant a une erreur.
Dim aErr(128) As Boolean

Je voudrais passer a une representation plus condensee (disque)
ou chacun des bits d'une chaine de caracteres fixe est
representatif de l'erreur.
Dim sErr As String *16

Je n'arrive pas a trouver de codes operation manipulant
simplement les bits.
Je recherche des morceaux de code me permettant de passer
de la representation tableau a la representation chaine,
et vice-versa





je sais pas si ça répond à tes besoins, voilà un exemple que j'utilise sur
une feuille où 6 checkbox peuvent être activés ou desactivé je stock la
valeur des combinaisons dans un entier
donnee(i) est le nom du checkbox



Public Function bintodec(ar() As Integer) As Integer
Dim a As Integer
For i% = 0 To UBound(ar())
If ar(i%) = 1 Then
a = a + 2 ^ i%
End If
Next i%
bintodec = a
End Function



Rien de personnel contre ta solution, d'autant que
-je n'ai rien trouve de fondamentalement meilleur
-je crains qu'il n'y ait rien de fondamentalement meilleur (cf infra)
mais c'est une usine a gaz.
Je n'en ai pas apres toi, mais apres le langage:
Si VB6 impose de passer par des ^2 pour manipuler des bits
c'est tout simplement dissuasif

J'ai cherche du cote des API, mais CopyMemory & Co ne manipulent rien de plus petit que le Byte (octet)
De fait, eg je croyais que
"&B" permettait de declarer une valeur en bits
comme "&H" permettait de declarer une valeur en hexa
mais je me suis fait jeter ...

GRRRRR
Avatar
Christophe
Re,
Je crois qu'il y a une solution pour isoler le bit n d'un nombre en
utilisant un masque hexa
du style
&HA8F4 and &HFFFF
mais je me suis pas penché sur la question

note que mon usine à gaz permet de stocker un grand nombre de combinaisons
dans un entier ou mieux un long
Tu mets 32 case à cocher qui definissent les preferences utilisateurs et tu
stockes ça sur 1 long.

christophe V

"xx" a écrit dans le message de news:

"Christophe" a écrit dans le message de


news:bl0ut7$iv1$
> "xx" a écrit dans le message de news:
>

>> J'ai le probleme suivant:
>> -une petite centaine de messages d'erreur/information differents
>> (arrondissons a 128 ...)
>> -Plusieurs indicateurs d'erreur peuvent etre excites simultanement
>>
>> J'ai donc dans le programme un tableau de booleans,
>> chacun correspondant a une erreur.
>> Dim aErr(128) As Boolean
>>
>> Je voudrais passer a une representation plus condensee (disque)
>> ou chacun des bits d'une chaine de caracteres fixe est
>> representatif de l'erreur.
>> Dim sErr As String *16
>>
>> Je n'arrive pas a trouver de codes operation manipulant
>> simplement les bits.
>> Je recherche des morceaux de code me permettant de passer
>> de la representation tableau a la representation chaine,
>> et vice-versa

> je sais pas si ça répond à tes besoins, voilà un exemple que j'utilise


sur
> une feuille où 6 checkbox peuvent être activés ou desactivé je stock la
> valeur des combinaisons dans un entier
> donnee(i) est le nom du checkbox

> Public Function bintodec(ar() As Integer) As Integer
> Dim a As Integer
> For i% = 0 To UBound(ar())
> If ar(i%) = 1 Then
> a = a + 2 ^ i%
> End If
> Next i%
> bintodec = a
> End Function

Rien de personnel contre ta solution, d'autant que
-je n'ai rien trouve de fondamentalement meilleur
-je crains qu'il n'y ait rien de fondamentalement meilleur (cf infra)
mais c'est une usine a gaz.
Je n'en ai pas apres toi, mais apres le langage:
Si VB6 impose de passer par des ^2 pour manipuler des bits
c'est tout simplement dissuasif

J'ai cherche du cote des API, mais CopyMemory & Co ne manipulent rien de


plus petit que le Byte (octet)
De fait, eg je croyais que
"&B" permettait de declarer une valeur en bits
comme "&H" permettait de declarer une valeur en hexa
mais je me suis fait jeter ...

GRRRRR




Avatar
xx
"Christophe" a écrit dans le message de news:bl1o9h$f1f$
Re,
Je crois qu'il y a une solution pour isoler le bit n d'un nombre en
utilisant un masque hexa



Je connais, mais masque hexa ou puissances de 2 restent du meme niveau niveau "usine a gaz"

note que mon usine à gaz permet de stocker un grand nombre
de combinaisons dans un entier ou mieux un long



J'avais le meme objectif, et encore une fois ta solution n'est pas en cause, mais le langage (VB6) qui a ma connaissance ne permet
pas simplement de manipuler des bits.

FYI:
Une solution avec des masques hexa
(Attention: booleans, octets et bits sont ranges de gauche a droite)
(Tableaux en base 1)
(dans mon application un tableau de 128 booleans <-> 16 octets)

'############################################################################################
Private Function BoolToString(aBool() As Boolean) As String
'Dim sW1 As String * 1 '=Chr(lW1)
Dim lW1 As Long '=Asc(sW1)
Dim L As Long 'Length of returned string
Dim I As Integer 'Position of byte in string (1-based)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L = UBound(aBool) / 8
If (8 * L) < UBound(aBool) Then L = L + 1
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For I = 1 To L
lW1 = 0
If (aBool((I - 1) * 8 + 1)) Then lW1 = lW1 Or &H80
If (aBool((I - 1) * 8 + 2)) Then lW1 = lW1 Or &H40
If (aBool((I - 1) * 8 + 3)) Then lW1 = lW1 Or &H20
If (aBool((I - 1) * 8 + 4)) Then lW1 = lW1 Or &H10
If (aBool((I - 1) * 8 + 5)) Then lW1 = lW1 Or &H8
If (aBool((I - 1) * 8 + 6)) Then lW1 = lW1 Or &H4
If (aBool((I - 1) * 8 + 7)) Then lW1 = lW1 Or &H2
If (aBool((I - 1) * 8 + 8)) Then lW1 = lW1 Or &H1
'sW1 = Chr$(lW1)
'BoolToString = BoolToString & sW1
BoolToString = BoolToString & Chr$(lW1)
Next I
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Function
'############################################################################################
Private Function StringToBool(sWWW As String) As Variant
'Dim sW1 As String * 1 '=Chr$(lW1)
Dim lW1 As Long '=Asc(sW1)
Dim L As Long 'Length of passed string
Dim I As Integer 'Position of byte in string (1-based)
Dim S2B() As Boolean
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L = Len(sWWW)
ReDim S2B(1 To L * 8)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For I = 1 To L
'sW1 = Mid(sWWW, I, 1)
'lW1 = Asc(sW1)
lW1 = Asc(Mid(sWWW, I, 1))
If (lW1 And &H1) Then S2B((I - 1) * 8 + 8) = True
If (lW1 And &H2) Then S2B((I - 1) * 8 + 7) = True
If (lW1 And &H4) Then S2B((I - 1) * 8 + 6) = True
If (lW1 And &H8) Then S2B((I - 1) * 8 + 5) = True
If (lW1 And &H10) Then S2B((I - 1) * 8 + 4) = True
If (lW1 And &H20) Then S2B((I - 1) * 8 + 3) = True
If (lW1 And &H40) Then S2B((I - 1) * 8 + 2) = True
If (lW1 And &H80) Then S2B((I - 1) * 8 + 1) = True
Next I
StringToBool = S2B
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Function
'############################################################################################
Avatar
Philippe ILLINGER
bj,

"xx" wrote in message
news:
"Christophe" a écrit dans le message de


news:bl0ut7$iv1$
> "xx" a écrit dans le message de news:
>

>> J'ai le probleme suivant:
>> -une petite centaine de messages d'erreur/information differents
>> (arrondissons a 128 ...)
>> -Plusieurs indicateurs d'erreur peuvent etre excites simultanement
>>
>> J'ai donc dans le programme un tableau de booleans,
>> chacun correspondant a une erreur.
>> Dim aErr(128) As Boolean
>>
>> Je voudrais passer a une representation plus condensee (disque)
>> ou chacun des bits d'une chaine de caracteres fixe est
>> representatif de l'erreur.
>> Dim sErr As String *16
>>
>> Je n'arrive pas a trouver de codes operation manipulant
>> simplement les bits.
>> Je recherche des morceaux de code me permettant de passer
>> de la representation tableau a la representation chaine,
>> et vice-versa

> je sais pas si ça répond à tes besoins, voilà un exemple que j'utilise


sur
> une feuille où 6 checkbox peuvent être activés ou desactivé je stock la
> valeur des combinaisons dans un entier
> donnee(i) est le nom du checkbox

> Public Function bintodec(ar() As Integer) As Integer
> Dim a As Integer
> For i% = 0 To UBound(ar())
> If ar(i%) = 1 Then
> a = a + 2 ^ i%
> End If
> Next i%
> bintodec = a
> End Function

Rien de personnel contre ta solution, d'autant que
-je n'ai rien trouve de fondamentalement meilleur
-je crains qu'il n'y ait rien de fondamentalement meilleur (cf infra)
mais c'est une usine a gaz.
Je n'en ai pas apres toi, mais apres le langage:
Si VB6 impose de passer par des ^2 pour manipuler des bits
c'est tout simplement dissuasif

J'ai cherche du cote des API, mais CopyMemory & Co ne manipulent rien de


plus petit que le Byte (octet)
De fait, eg je croyais que
"&B" permettait de declarer une valeur en bits
comme "&H" permettait de declarer une valeur en hexa
mais je me suis fait jeter ...

GRRRRR





Il te reste toujours, la solution de passer par un DLL en C, qui te fait le
travail.
(j'en ai fait une, il y a quelque temps, pour tester les odl...)

Best regards


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.521 / Virus Database: 319 - Release Date: 23/09/2003
Avatar
Christophe
Salut tu veux pas m'en faire une qui permet d'aller gerer les bits d'un DIB
noir & blanc (c'est pas Noel mais on sait jamais)

christophe Vergon




"Philippe ILLINGER" a écrit dans le
message de news:
bj,

"xx" wrote in message
news:
> "Christophe" a écrit dans le message de
news:bl0ut7$iv1$
> > "xx" a écrit dans le message de news:
> >
>
> >> J'ai le probleme suivant:
> >> -une petite centaine de messages d'erreur/information differents
> >> (arrondissons a 128 ...)
> >> -Plusieurs indicateurs d'erreur peuvent etre excites simultanement
> >>
> >> J'ai donc dans le programme un tableau de booleans,
> >> chacun correspondant a une erreur.
> >> Dim aErr(128) As Boolean
> >>
> >> Je voudrais passer a une representation plus condensee (disque)
> >> ou chacun des bits d'une chaine de caracteres fixe est
> >> representatif de l'erreur.
> >> Dim sErr As String *16
> >>
> >> Je n'arrive pas a trouver de codes operation manipulant
> >> simplement les bits.
> >> Je recherche des morceaux de code me permettant de passer
> >> de la representation tableau a la representation chaine,
> >> et vice-versa
>
> > je sais pas si ça répond à tes besoins, voilà un exemple que j'utilise
sur
> > une feuille où 6 checkbox peuvent être activés ou desactivé je stock


la
> > valeur des combinaisons dans un entier
> > donnee(i) est le nom du checkbox
>
> > Public Function bintodec(ar() As Integer) As Integer
> > Dim a As Integer
> > For i% = 0 To UBound(ar())
> > If ar(i%) = 1 Then
> > a = a + 2 ^ i%
> > End If
> > Next i%
> > bintodec = a
> > End Function
>
> Rien de personnel contre ta solution, d'autant que
> -je n'ai rien trouve de fondamentalement meilleur
> -je crains qu'il n'y ait rien de fondamentalement meilleur (cf infra)
> mais c'est une usine a gaz.
> Je n'en ai pas apres toi, mais apres le langage:
> Si VB6 impose de passer par des ^2 pour manipuler des bits
> c'est tout simplement dissuasif
>
> J'ai cherche du cote des API, mais CopyMemory & Co ne manipulent rien de
plus petit que le Byte (octet)
> De fait, eg je croyais que
> "&B" permettait de declarer une valeur en bits
> comme "&H" permettait de declarer une valeur en hexa
> mais je me suis fait jeter ...
>
> GRRRRR
>


Il te reste toujours, la solution de passer par un DLL en C, qui te fait


le
travail.
(j'en ai fait une, il y a quelque temps, pour tester les odl...)

Best regards


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.521 / Virus Database: 319 - Release Date: 23/09/2003