49 votes

Comprendre l'opérateur bitwise AND

J'ai lu sur bits les opérateurs en Objective-C dans Kochan du livre, "la Programmation en Objective-C".

Je suis TRÈS confus au sujet de cette partie, même si j'ai vraiment compris la plupart des tout le reste présenté à moi à ce jour.

Voici une citation du livre:

Le niveau du Bit ET de l'Opérateur

Au niveau du bit ANDing est fréquemment utilisé pour les opérations de masquage. C'est cet opérateur peut facilement être utilisé pour définir les bits d'un élément de données à 0. Par exemple, l'instruction

w3 = w1 & 3;

attribue à w3, la valeur de w1 bit à bit ANDed avec la constante 3. Cela a le même ffect de l'établissement de tous les bits de w, autres que la droite deux bits à 0 et la préservation de la droite à deux bits à partir de w1.

Comme avec tous les opérateurs arithmétiques binaires en C, le binaire, les opérateurs peuvent également être utilisés comme opérateurs d'affectation par l'ajout d'un signe égal. La déclaration

word &= 15;

par conséquent, on effectue la même fonction que les suivantes:

word = word & 15;

En outre, il a pour effet de créer toutes les mais la la plus à droite, quatre bits du mot à 0. Lors de l'utilisation de constantes dans l'exécution des opérations bit à bit, il est généralement plus commode d'exprimer les constantes dans les deux octal ou hexadécimal.

OK, donc c'est ce que j'essaie de comprendre. Maintenant, je suis extrêmement confus avec à peu près la totalité de ce concept et je suis juste à la recherche d'un peu de clarification si quelqu'un est prêt à m'aider sur ce point.

Lorsque le livre des références "réglage de tous les bits" maintenant, tous les bits.. c'est Quoi exactement un peu. N'est-ce pas juste un 0 ou un 1 en 2ème base, en d'autres termes, binaire?

Si oui, pourquoi, dans le premier exemple, sont tous les bits à l'exception de la "droite 2" à 0? Est-il 2 parce que c'est 3 - 1, en prenant 3 à partir de notre constante?

Merci!

148voto

Dave DeLong Points 156978

Les chiffres peuvent être exprimées en binaire, ressemble à ceci:

3    = 000011
5    = 000101
10   = 001010

...etc. Je vais supposer que vous êtes familier avec le binaire.

Au niveau du bit ET les moyens à prendre deux nombres, les aligner les uns sur les autres, et de créer un nouveau numéro qui a un 1, où les deux nombres de 1 (tout le reste est 0).

Par exemple:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

Or les moyens de prendre deux nombres, les aligner les uns sur les autres, et de créer un nouveau numéro qui a un 1, où le nombre de 1 (tout le reste est 0).

Par exemple:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

Au niveau du bit XOR (OU exclusif) les moyens de prendre deux nombres, les aligner les uns sur les autres, et de créer un nouveau numéro qui a un 1, où le nombre de 1 ET de l'autre nombre est de 0 (tout le reste est 0).

Par exemple:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

Au niveau du bit NOR (Non OU) les moyens de prendre un OU Binaire de deux nombres, puis inverser tout (où il y avait un 0, il y a maintenant 1, où il y a un 1, il y a un 0).

Bit-à-bit de la NAND (Non ET) les moyens de prendre l'or au niveau du Bit ET de deux nombres, puis inverser tout (où il y avait un 0, il y a maintenant 1, où il y a un 1, il y a un 0).

Continue: pourquoi est - word &= 15 ensemble tous les mais les 4 bits les plus à droite de 0? Vous devriez être en mesure de le comprendre maintenant...

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

(0 AND a = 0, 0 AND b = 0, ... j AND 1 = j, i AND 1 = i, ...)

Comment est-ce utile? Dans de nombreuses langues, nous utilisons des éléments appelés "masques de bits". Un masque de bits qui est essentiellement un nombre qui représente tout un tas de petits nombres combinés ensemble. Nous pouvons combiner des numéros ensemble à l'aide de OU, puis séparez-les à l'aide de ET. Par exemple:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

Si je n'ai que la carte et le chapeau, je peux exprimer myInventoryBitmask = (MagicMap | MagicHat) , et le résultat est mon masque de bits. Si je n'ai pas de rien, alors mon masque de bits est de 0. Si je veux voir si j'ai ma baguette, je peux le faire:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}

Pour l'obtenir?

EDIT: plus de trucs

Vous pourrez également venir à travers la "bitshift" opérateur: << et >>. Cela signifie simplement "shift tout à gauche de n bits" ou "shift tout droit de n bits".

En d'autres termes:

1 << 3 = 0001 << 3 = 0001000 = 8

Et:

8 >> 2 = 01000 >> 2 = 010 = 2

2voto

cHao Points 42294

"Bit" est la contraction de "binary digit (chiffre binaire". Et oui, c'est un 0 ou un 1. Il y a presque toujours 8 dans un octet, et ils sont écrits un peu comme les nombres décimaux sont -- avec le plus de chiffre significatif sur la gauche, et le moins significatif sur la droite.

Dans votre exemple, w1 & 3 masques tout, mais les deux moins importante (la plus à droite) chiffres car 3, en binaire, est 00000011. (2 + 1) ET renvoie 0 si les deux bits étant ANDed est 0, pour tout, mais les deux derniers bits sont automatiquement 0.

1voto

insipid Points 1510
 w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab
 

0 & n'importe quel bit N = 0

1 & n'importe quel bit N = N

Ainsi, tout ce qui est binaire et avec 3 a tous leurs bits sauf les deux derniers mis à 0. Les deux derniers bits, a et b dans ce cas, sont conservés.

1voto

@cHao & tous: Non! Les Bits ne sont pas des numéros. Ils ne sont pas à zéro ou à un!

Eh bien, 0 et 1 sont possibles et valides interprétations. Zéro et un est typique de l'interprétation.

Mais un peu est seulement une chose, ce qui représente une alternative simple. Il dit que "c'est" ou "il n'est pas". Il ne dit rien au sujet de la chose, le "il", lui-même. Cela ne veut pas dire que tout ce que c'est.

Dans la plupart des cas, cela ne vous dérangera pas. Vous pouvez les prendre pour des nombres (ou des parties, des chiffres, des nombres) que vous (ou la combinaison de langages de programmation, cpu et d'autres composants matériels, vous savez comme "typique") usaly faire – et peut-être que vous n'aurez jamais de problèmes avec eux.

Mais il n'y a aucun problème principal, si vous changez le sens de "0" et "1". Ok, si cela lors de la programmation assembleur, vous trouverez qu'il est un peu problématique car des mnémoniques va faire autre logique, puis ils vous disent avec leurs noms, les numéros seront réduites à néant et de telles choses.

Jetez un oeil à http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm si vous le souhaitez.

Salutations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X