2009-04-23 7 views
6

J'ai besoin de faire un calcul inverse, qui consiste en opération au niveau du bit AND, comment le faire?Quelle est l'inverse de AND binaire en C#?

J'ai essayé exclusif OU, mais cela n'a pas aidé.

 int i = 254 & 2; 
     Console.Write("254 & 2 ={0}", i + "\n"); 
     Console.Write("{0}^2 ={1}",i, (i^2) + "\n"); 

Ne fonctionne pas. Comment puis-je faire ce calcul?

+3

Quand vous dites "Ne fonctionne pas", que voulez-vous dire? Il compile et produit le résultat attendu pour moi. Quel résultat affiche-t-il pour vous, et surtout quel résultat voulez-vous qu'il affiche pour vous? –

+0

La seule opération de bit réversible que vous avez est XOR, donc '(a^b)^b == a'. Si vous voulez inverser votre opération et que vous n'êtes pas encore décidé à utiliser AND, essayez plutôt cela. – Blindy

Répondre

27

Étant donné i, vous ne pouvez pas revenir 254. Par & vous avez détruit quelles données n'ont pas été stockées dans le second bit.

1111 1110 
&0000 0010 
---------- 
0000 0010 

Comment récupérer les 6 bits perdus? Pour x & 2 == 2, vous pouvez mettre presque x et ce serait vrai.

0010 1010 // = 42 
&0000 0010 
---------- 
0000 0010 

Est-ce que x est 254 ou 42? Tu ne peux pas le dire.

3

Vous ne pouvez pas, vous avez perdu les données qui étaient là lorsque vous avez fait le &.

exemple 4 bits:

1110 & 0010 = 0010 

Vous avez aucun moyen de savoir quels bits étaient 1 et qui ne sont pas si vous ne connaissez le résultat 0010 et le second opérande du & (également 0010).

21

Techniquement à l'opposé de ET est NAND:

~ (254 & 2)

Notez que le ~ est l'opérateur du complément et ne Bitwise PAS (Toggle chaque bit à sa contraire).

Mais que voulez-vous exactement? Qu'est-ce que vous essayez d'accomplir?

Si vous essayez d'annuler le calcul, vous ne pouvez pas - il n'y a pas de fonction inverse telle que inverseand (et (x, y)) retournera x ou y, même si inverse est donné l'un d'entre eux.

-Adam

+2

+1 en partie parce que je * pense * que vous êtes sur la bonne voie, mais surtout à cause de la question "qu'est-ce que vous voulez", qui est vraiment le problème ici ... ce n'est pas complètement évident. – Beska

0

Qu'entendez-vous par calcul opposé?

Si vous voyez le numéro 254 comme un registre de bits composé de 8 bits, tous les bits sauf le dernier sont mis à 1.

Calculer 254 & 2 revient à vérifier si le bit 2 du registre est activé.

Quel est le contraire? Vérifier si tous les autres bits sont définis?

0

Si le but de l'opération & est de vérifier si le bit 1 est activé, alors une opération potentielle "opposée" est "définir le bit 1".

i.e. .:

val = val | 2; 

Cette remplace la valeur actuellement bit 2, et ne touche aucun autre bit.

Si les 8 bits de l'octet sont considérés comme des bits complètement indépendants, il est possible de changer l'un d'entre eux en touchant l'un des autres.

Dans ce cas, peu importe que certaines informations d'origine aient été perdues. Nous ne nous soucions pas vraiment de la valeur des autres bits, et le plus souvent lorsque nous utilisions des masques binaires, la valeur d'origine du bit en question était nulle de toute façon.

Questions connexes