Explication détaillée des opérateurs de bits et quelques conseils d'utilisation des bits

En savoir plus sur les opérateurs bit à bit aujourd'hui.

insérez la description de l'image ici

Amusez-vous à apprendre aujourd'hui !

1. Quels sont les opérateurs ? Comment l'utiliser?

& Bitwise AND : Opération bit à bit Identique à 1 , les autres valent 0
| Bitwise OR : Opération bit à bit Identique à 0 , les autres valent 1
^ Bitwise XOR : Opération bit à bit La différence est 1, idem 0 ~
Négation : Opération bit à bit Bit à bit inversion (opérateur unaire) << Décalage à gauche : Décalage à gauche bit à bit pour compléter 0 >> Décalage à droite : Décalage bit à bit à droite signé pour compléter le bit le plus fort Bit de signe, remplissez 0 pour les nombres non signés . À l'exception de la négation de ~, tout le reste est un opérateur binaire.


2. À quels types de données les opérateurs bit à bit s'appliquent-ils ?

La réponse est qu'elle ne s'applique qu'à la famille des entiers, pas à la famille des virgules flottantes.
La raison essentielle est que les types de stockage de données des deux sont différents.
Le stockage de la famille plastique a été évoqué dans l'article précédent, je ne vais donc pas le répéter.

  • La méthode de stockage de la famille des entiers
    La méthode de stockage de la famille des flottants doit respecter les dispositions de IE754.

3. Exemple de XOR bit à bit et bit à bit ou bit à bit

Exemple 1 : Trouver le nombre de 1 en binaire. Prendre & (ET au niveau du bit)

    int a = 0;
	scanf("%d", &a);
	int count = 0;
	while (a)
	{
    
    
		a = a&(a - 1);//每次把最低位丢弃,直到a为0.
		count++;
	}
	printf("%d\n", count);

Exemple 2 : Trouver le nombre de 0 en binaire en utilisant | (OU au niveau du bit), (très intéressant, vous pouvez jeter un œil)

	int a = 0;
	int count = 0;
	scanf("%d", &a);
 	while (a+1)
	{
    
    
		a = a | (a + 1);
		count++;
	}
	printf("%d\n", count);

Ce code est très intéressant, il utilise la troncature après débordement de données pour rendre la condition de jugement vraie.
Tout d'abord, a + 1 est utilisé dans le jugement car il faut inclure 0. Plus par coïncidence, lorsque a + 1 est égal à 0, il se trouve que a est - 1. Nous savons qu'il n'y a pas de 0 dans le complément à deux de -1 .                                                                                                                                                 »

Exemple 3 : Utilisez ^ (OR exclusif au niveau du bit) pour échanger les valeurs de deux variables.

Tout d'abord pour connaître certaines des conclusions les plus élémentaires :
1. Un nombre XOR 0, ou lui-même.
2. Un nombre XOR lui-même vaut 0
Ceci est dérivé du concept XOR.

Reprenons cette question, y a-t-il une idée ?
D'abord un XOR b, puis effectuez un XOR, ce qui équivaut à b = b^ b^a.
De même, a peut être obtenu.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("after:%d %d\n", a, b);

Ci-dessous, le calcul.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("after:%d %d\n", a, b);

Le plus grand avantage de la méthode XOR par rapport à la méthode mathématique est qu'il n'est pas nécessaire de considérer le problème de débordement. Si deux très grands nombres sont opérés mathématiquement, le débordement peut se produire.

4. Opérateur de décalage à gauche

Le décalage vers la gauche est relativement simple, en supprimant les bits de poids fort et en remplissant les bits de poids faible avec 0.
Le cas du décalage à droite est discuté :
décalage à droite arithmétique : pour les nombres signés, le bit le plus fort est complété par le bit de signe.
Décalage logique vers la droite : pour les nombres non signés, le bit le plus élevé est rempli avec 0.

Voir un exemple :

    int a = -1;
	unsigned int b = -1;
	printf("%d\n", a >> 1);
	printf("%u\n", b >> 1);

insérez la description de l'image ici
Après l'exécution, on constate que -1 est imprimé en premier, puis 2 30 -1 est imprimé.Analysez
d'abord a>>1, car a est un nombre négatif signé, donc le signe du bit le plus élevé est 1 lors du remplissage, et le dernier complément La valeur est toujours 1.
Regardez b>>1, car b est un nombre non signé, donc le bit le plus élevé est rempli avec 0 lors du remplissage des bits, et enfin le premier bit est 0, et les autres sont 1.

Alors, quelle est la portée du changement?
Tout d'abord, les données de type int n'ont que 32 bits, donc le décalage maximum est de 31 bits, alors qu'en est-il de la valeur minimum ? La valeur minimale est-elle **-31 bits ? ** Non, ni le décalage gauche ni le décalage droit ne peuvent décaler les bits négatifs.
La plage de décalage est donc de 0 à 31 bits.

Voyons un exemple
de problème de priorisation.

    int a = 1;
	a = a << 2 + 3;
	printf("%d", a);

Tout d'abord, le résultat est 32, donc si vous le regardez de cette façon, c'est d'abord (2+3), puis le décalage est effectué.
Par conséquent, lors de l'utilisation du caractère de décalage, nous devons considérer la question de la priorité.

5. Demande d'opérateur de quart

La position bit par bit peut être définie sur 0 ou 1 à l'aide de l'opérateur de décalage
Bit par bit, définie sur 1.

    unsigned int a = 1;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		a = a|(a << i);
	}
	printf("%d", a);

Comme le dernier est un nombre signé, il est imprimé sous la forme -1.

petit à petit, remis à 0

    unsigned int a = -1;
	for (int i = 0; i < 32; i++)
	{
    
    
		a = a & (a >> i);

	}
	printf("%d", a);

Étant donné que a est un nombre non signé, lors de la complémentation des bits, 0 est ajouté et un OU au niveau du bit est effectué après le décalage. La dernière impression est 0.

6. Quelques conseils

  1. x&1 == 0 pour juger s'il est pair, le dernier bit du nombre pair est 0.
  2. Les valeurs de deux nombres peuvent être échangées par XOR.
  3. x & (x-1) peut transformer un 1 sur le bit le plus à droite en un 0.
  4. Pour les nombres positifs, x&(x-1)==0 est de juger si c'est une puissance de 2.
  5. XOR deux nombres identiques, le résultat est 0, et XOR un nombre avec 0, le résultat est lui-même. Peut être utilisé pour trouver des nombres.

7. Le prochain avis

Ce problème n'a toujours pas fini d'écrire les trucs ++. Dans le prochain numéro, je parlerai des connaissances liées à ++ et –.
Le prochain numéro sera plus excitant ~~~
insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/m0_64770095/article/details/124022347
conseillé
Classement