Renvoyer état de chaque bit d'un mot binaire

Bonjour ,

Je cherche le moyen d'extraire l'état d' un bit d' un mot binaire .

Comme tel:

Pour 10000100 l'état du bit 1 est 0

Pour 10000100 l'état du bit 2 est 0

Pour 10000100 l'état du bit 3 est 1

Pour 10000100 l'état du bit 8 est 1

En reportant le résultat binaire de chaque bit dans une cellule différente

En gros 10000100 correspond a l'état de 8 entrée numériques ou 8 états de 8 contacts récupérés sur un datalogger .

Et je n'arrive pas a créer une formule me permettant de vérifier l'état de chacun de ces bits que je remplacerais ensuite par contact ouvert ou contact fermé dans une formule .

Si quelqu'un a une idée ,merci d'avance

Bonjour,

si "10001010" est en c3

=STXT($C$3;9-COLONNES($A:A);1)*1, a etirer vers la droite

Crdmt

Bonjour,

une autre proposition (en partant d'un nombre décimal en A1), formule à mettre en B1 et à tirer jusqu'en I1

=SI(BITET($A1;2^(9-COLONNE()))>0;1;0)

Bonjour,

Je suis très dubitatif sur ce que tu veux obtenir, en l'absence de classeur, car tu pars d'un mot constitué d'une chaîne de 1 ou 0, et lister les valeurs de chaque caractère ne présente pas de difficulté, comme l'indique DjiDji ( que je salue ).

J'ai donc à tout hasard travaillé sur la conversion de cette chaîne en nombre. La valeur du mot s'obtient en additionnant pour chaque bit-caractère une puissance de 2 lorsqu'il est à 1.

Soit : i variant de 1 à 8 (pour balayer les bits [à prendre de la droite vers la gauche]), si le bit est à 1 on additionne : 2^(i-1).

Et pour test chaque bit : If 2^(i-1) And ValeurMot .... i étant alors le numéro du bit testé.

Je proposerai donc une fonction (établie comme fonction de feuille de calcul destinée à tester un bit déterminé :

Function ValMot(mot As String) As Integer
    Dim i%, n%, v%
    n = Len(mot)
    For i = n To 1 Step -1
        If Mid(mot, i, 1) = "1" Then
            v = v + 2 ^ (n - i)
        Else
            If Mid(mot, i, 1) <> "0" Then
                v = -1
                Exit For
            End If
        End If
    Next i
    ValMot = v
End Function

Function VBITN(mot As String, num As Integer)
    Dim vmot%
    Application.Volatile
    vmot = ValMot(Right(mot, num))
    If vmot >= 0 Then
        VBITN = IIf(2 ^ (num - 1) And vmot, 1, 0)
    Else
        VBITN = CVErr(xlErrValue)
    End If
End Function

La fonction utilise une fonction auxiliaire, calculant la valeur du mot dont un bit est cherché (ceci pour distinguer les deux phases, mais aussi pour opérer vérification que la fraction de mot incluant le bit cherché constitue bien une valeur binaire...)

Si en A1, tu as : 10000101 sous forme de chaîne, =VBITN(A1;3) renverra : 1

=VBITN(A1;5) renverra 0 et =VBITN(A1;8) renverra 1.

Mais le contexte d'utilisation serait utile. On peut transformer assez aisément cette fonction en matricielle pour renvoyer simultanément la totalité des valeurs de bits d'un mot...

L'idée essentielle reste le test au moyen de puissances de 2 d'une valeur binaire convertie en décimal, dont une foule d'adaptations est possible.

Cordialement.


Je salue également H2SO4 : la fonction BITET (apparue avec Excel 2013) semble pouvoir jouer le même rôle...

Encore merci d'avance de votre aide !

Pour être honnête ,j'ai quelque eu un peu de mal a comprendre les formules que vous m'avez présenté .

Je l'ai ai appliquée en essayant de les comprendre en les décortiquant .

Mais une fonction m'a parlée : =STXT !

Sortir un caractère a partir d'info du bit de poids fort ,sa position et sa longueur ,exactement ce que je cherchais !

=STXT(E1;1;1) pour le premier bit (MSB)

=STXT(E1;2;1) pour le second bit

=STXT(E1;9;1) pour le dernier bit (LSB)

Pour plusieurs cellules

Comme ces bit d'état représente des bits d'état électrique ,j'y ai ajouté une variante SI

=SI(STXT(E1;1;1)="1";close";"open") pour le premier bit (MSB)

Une mise en forme spécifique et j'ai ce que je voulais !

Pour vous donner une idée de ce que je voulais faire :

En colonne A > le numéro d'échantillon

En colonne B > le temps instantané par coupure de 20 ms (échantillonnage de 50 hz)

En colonne C > L'échantillon décimal pré-converti par un précédent programme

En colonne E > La conversion binaire de mon échantillon

En colonne G à O > L'état convertit de mes entrée numérique (en l'occurrence des contacts secs)

un filtre et je pourrais savoir a un instant t de l'enregistrement l'état de mes entrées ...


Mais j'y serais pas arrivé sans vos post !

Cela fais quand même trois jours que je me penche sur le problème !

Alors encore merci de votre aide

Révision de ma fonction en fonction de ton tableau et du mode de calcul adopté :

Function VBITN(v As Integer, n As Integer)
    Dim vbit(), i%
    Application.Volatile
    ReDim vbit(n - 1)
    For i = n To 1 Step -1
        If 2 ^ (n - i) And v Then
            vbit(i - 1) = "close"
        Else
            vbit(i - 1) = "open"
        End If
    Next i
    VBITN = vbit
End Function

v est la valeur décimale de ton échantillon, n le nombre de bits à tester.

Utilisation :

Sélection de la plage G1:O1 (9 cellules en ligne, puisque 9 bits à évaluer)

Frappe formule: =VBITN(C1;9)

Validation matricielle par Ctrl+Maj+Entrée.

Chaque cellule de la sélection prend la valeur "open" ou "close" selon la valeur du bit concerné.

On garde la sélection G1:O1 (ou on resélectionne) et on tire vers le bas pour étendre la formule sur le tableau.

Cordialement.

Rechercher des sujets similaires à "renvoyer etat chaque bit mot binaire"