En lisant une documentation ici , je suis tombé sur ceci: Je n'ai aucune idée de la façon dont cela fonctionne. Je lisa sur les opérateurs bitwises en C, mais je ne comprends pas comment vous pouvez installer trois constantes (ou plus!) À l'intérieur d'un INT et de la possibilité de les extraire de l'int? Creuser plus loin la documentation, j'ai également trouvé cela, ce qui est probablement associé: p> Comment est le (1 << 3) CODE> Déclarations / Variables travail? Je suis désolé si cela est trivial, mais quelqu'un pourrait-il s'il vous plaît éclairer en expliquant ou peut-être publier un lien vers une bonne explication? P> P>
5 Réponses :
Le numéro 1 est représenté comme 00000000000000000000000000000001 (1 << n) des moyens de décalage des 1 dans la représentation de 1 n positions vers la gauche Donc (1 << 3) serait 00000000000000000000000000001000 Dans un entier, vous pouvez avoir 32 options dont chacun peut être activé ou désactivé. Numéro de l'option n est le nième si le bit est égal à 1 p>
Si vous regardez un numéro en binaire, chaque chiffre est sur ( Vous pouvez utiliser des opérateurs binaire pour définir ou interroger efficacement les bits individuels pour voir si elles sont définies ou non. P>
Prendre la valeur 8 bits 156. En binaire, c'est Les bits définis correspondent aux bits 1 code>) ou éteint (
0 code>). p>
10011100 code>. P>
7 code>,
4 code>,
3 code> et
2 code> (valeurs
128 code>,
16 code>,
8 code>,
4 code>). Vous pouvez calculer ces valeurs avec
1 << (position) code> assez facilement. Donc,
1 << 7 code> =
128 code>. P>
Plus généralement, binaire p> 1 est fondamentalement la même chose que
2 à la puissance de y code>
x est la même chose que
x multipliée par 2 à la puissance y code>. p>
x des moyens de déplacement de tous les bits du code x code> vers la gauche par
y code> endroits, en ajoutant des zéros à la place des bits déplacés: p>
00010 p>
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
...
En fait, les constantes sont représentées par un simple bit, donc si vous avez un entier de 32 bits, vous pouvez adapter à 32 constantes en elle. Vos constantes doivent être des puissances de deux, de sorte qu'ils ne prennent qu'un seul bit "ensemble" pour représenter
Par exemple:. P>
if (options & CONSTANT_3) { // CONSTANT_3 is set }
Dans votre enum, vous vous retrouvez avec des valeurs que EACG a un bit différent de 1, alors lorsque vous construisez quelque chose comme <<< / code> est l'opérateur de changement de vitesse gauche, il déplace les bits du premier opérande laissé par le nombre de positions spécifiées dans l'opérande droit (avec des zéros entrant dans les positions décalées de la droite). p>
UnitDate code>, vous pouvez découvrir ultérieurement les indicateurs qu'il contient à l'aide du
& code> opérateur, par exemple
UnitDate & NSMONTHCALENDARUNIT == NSMONTHCALENDARUNIT CODE> sera vrai. P>
Cela ressemble à c-objectif? Est-ce mal étiquetée?
@Soapbox: L'exemple est vraiment pris de cacao, mais c'est vraiment droit C.
Cette deuxième ligne de code n'est pas C, non pas par un long shot.
@Soapbox: La deuxième ligne est vraiment pas pertinente à la question, cependant.