2008-10-01 19 views
2

curieux de savoir si quelqu'un pourrait avoir un aperçu de la façon dont je ferais ce qui suit à un nombre binaire:Bit Twiddle pour effectuer cette conversion

convertir

01+0 -> 10+1 (+ as in regular expressions, one or more) 
    01 -> 10 
    10 -> 01 

donc,

10101000010100011100 
01010100101010100010 

et pour préciser qu'il ne s'agit pas d'une simple inversion:

000000100000000000 
000001010000000000 

Je pensais regex, mais je travaille avec des nombres binaires et je veux rester comme ça. La page bit twiddling hacks ne m'a pas non plus donné un aperçu. Cela a clairement une certaine essence d'automates cellulaires. Donc, quelqu'un a quelques opérations qui peuvent prendre soin de cela? (aucun code n'est nécessaire, je sais comment faire ça).

+0

J'ai du mal à suivre ce que le premier "01 + 0" -> "10 + 1" est censé signifier. Votre exemple de conversion indique que vous ne voulez pas un compliment simple, mais pourriez-vous être plus clair sur la conversion que vous voulez? –

+1

L'exemple doit être corrigé ou clarifié. Actuellement, le seul «sens» que je peux voir est que si un 0 est à côté d'un 1 dans la source, il devient un 1 dans la cible. Sinon, le 0 reste 0, et tous les 1 deviennent 0 – workmad3

Répondre

11

Disons que x est votre variable. Alors vous auriez:

unsigned myBitOperation(unsigned x) 
{ 
    return ((x<<1) | (x>>1)) & (~x); 
} 
+0

bien fait, c'est la bonne réponse :) –

+0

merci // parfait! pour une raison ou une autre, j'ai oublié de changer quand je pensais à une solution. * embarrassée * ça n'arrivera plus jamais !! – nlucaroni

-2

Twidle en C/C++ est ~

+0

Si vous regardez attentivement, cet exemple n'est pas strictement un compliment. –

+0

il n'a pas spécifié la base 10 pour ces 2 chiffres et son sujet était un peu twittling. Par conséquent, je suppose que c'est la base de. Aussi je suppose que si je lui donne l'outil de base, il peut comprendre comment l'appliquer de manière plus complexe. –

+1

Il a dit "nombre binaire" qui est assez clairement la base 2. –