2017-07-21 12 views
2

J'écris un programme CQ dans R pour gérer les données d'un instrument qui signale ses propres codes d'erreur. Les codes sont présentés sous forme de valeurs de bits, sivaleur à partir d'éléments uniques

0 

signifie "tout est OK", alors que: -

1, 2, 4, 8, 16, 32, 64, 128 

représentent chacun une erreur unique. Plusieurs erreurs peuvent se produire simultanément, dans ce cas, les codes sont additionnés pour donner un nouveau numéro, par exemple: -

error "2" + error "32" = code "34" 

Et parce que ces sommes sont toutes uniques, une valeur de code donné peut être décomposé en ses erreurs constitutives. Je cherche un moyen de programmer l'identification des erreurs de ces codes. Je me bats avec une approche, mais tout ce que je peux penser implique soit des tables de consultation ou une grande pile de boucles ... ni l'un ni l'autre ne semble très élégant.

Plutôt que de réinventer la roue, je me demande s'il existe déjà une fonction R pour cela.

Est-ce que quelqu'un a rencontré ce genre de problème avant?

+0

Si vous avez toutes les puissances de 2, vous pouvez utiliser un OR bit à bit, par exemple. 'bitwOr (1,2)'. Ensuite, la désambiguïsation de l'erreur est juste si un 1 se produit à cette position, par exemple. 'bitwAnd (bitwOr (1,2), 2)' – jenesaisquoi

+0

Belle solution @jenesaisquoi! La réponse de Florian convient très bien à ce cas, mais je n'étais pas au courant des opérateurs bit à bit dans R, donc c'est vraiment utile! –

Répondre

4

Vous pouvez convertir le nombre en bits et utiliser cette représentation pour rechercher les erreurs.

2^(which(intToBits(34)==1)-1) 

retours

2 32 

Hope this helps!

+0

Belle solution + 1 ~ – Wen

+0

Je viens de terminer le codage d'une méthode en boucle, mais c'est largement supérieur (1 ligne au lieu de 20+) - merci Florian! –

+0

Content de pouvoir aider! – Florian