当前位置:网站首页>Compréhension approfondie du symbole [langue C]

Compréhension approfondie du symbole [langue C]

2022-07-04 21:26:00 Les singes t'apprennent à jouer au basket.

Conseils de basket - ball:N'oubliez pas de faire de l'exercice pendant la programmation.!

You wangt somenthing, go get it!


Table des matières

1、Opérateur bitwise

1.1 Bitwise or ( | ) Et Bitwise vs. ( & )

1.2 Xor bitwise ( ^ )  

1.3 Une question sur le levage intégral 

2、Déplacer l'opérateur 

2.1 À gauche.<<   À droite.>>Opérateur

2.2 Exercices d'exercices 

3、++ Et -- Fonctionnement

3.1 Fonctionnement de base 

3.2 Une compréhension approfondie du point de vue de l'assemblage a++


1、Opérateur bitwise

1.1 Bitwise or ( | ) Et Bitwise vs. ( & )

Nous avons parlé de logique ou de logique avec , Le résultat qu'ils obtiennent est vrai ou faux , Mais nous devons faire la distinction entre ,Opérateur bitwise "|" Et "&" Avec l'opérateur logique "||" "&&" C'est deux concepts .

Position, Simple sens , Fonctionnement en bits binaires numériques , Tout est fait sur la base du complément de données .

Bitwise or "|" :  Le complément binaire de deux valeurs fonctionne sur les bits correspondants ,Les bits correspondants ont 1 Oui. 1 ,Sinon 0.

Bitwise vs. "&": Le complément binaire de deux valeurs fonctionne sur les bits correspondants ,Les bits correspondants sont 1 Oui. 1, Sinon 0.

Voici quelques exemples:

1 | 2 :

1 Complément binaire pour:0000 0000 ... 0000 0001

2 Complément binaire pour:0000 0000 ... 0000 0010 

------Bitwise orRésultats:  0000 0000 ... 0000 0011   -> Correspond à la décimale:3      

1 & 2:

1 Complément binaire pour:0000 0000 ... 0000 0001

2 Complément binaire pour:0000 0000 ... 0000 0010 

------Bitwise vs.Résultats:  0000 0000 ... 0000 0000   -> Correspond à la décimale:0      

En fait, il y a beaucoup de professeurs d'université ou de livres qui peuvent presser ou ,Bitwise vs., Et ce que nous allons dire plus loin, c'est que l'hérésie positionnelle , Ils appelleront le résultat de chaque opération binaire C'est vrai.OuFaux, En fait, c'est Pas assez rigoureux , Le vrai et le faux sont des jugements logiques , Et le résultat de l'opération bitwise est numérique ,Et dansCDans la langue0Ça veut dire faux,Non0C'est vrai., C'est pourquoi je ne le recommande pas .

1.2 Xor bitwise ( ^ )  

Bitwise or "^" :  Le complément binaire de deux valeurs fonctionne sur les bits correspondants ,La même chose est 0 , La différence est 1

Voici quelques exemples:

1 ^ 3 :

1 Complément binaire pour:0000 0000 ... 0000 0001

3 Complément binaire pour:0000 0000 ... 0000 0011 

---Xor bitwiseRésultats:  0000 0000 ... 0000 0010   -> Correspond à la décimale:2     

5 ^ 0 :

5 Complément binaire pour:0000 0000 ... 0000 0101

0 Complément binaire pour:0000 0000 ... 0000 0000 

---Xor bitwiseRésultats:  0000 0000 ... 0000 0101   -> Correspond à la décimale:5     

Conclusions:N'importe quel nombre Xor0 Est égal à lui - même

Voici une question d'examen :Ne pas créer de variables temporaires,Pour réaliser l'échange de deux nombres.

// Ce que beaucoup de petits partenaires pensent directement :
int main()
{
    int a = 10;
    int b = 20;
    printf("a = %d, b = %d\n", a, b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

Mais regardons de plus près ce code , A - t - il des questions cachées ?

Un entier,Quatre octets,C'est - à - dire 32 Bits, Voici l'addition ,Il y aura une prise, Et si on additionnait deux grands nombres ? Leur somme dépasse la plage de stockage maximale de l'entier , Alors la troncature se produit dans l'ordinateur ! Pour éviter cela , Nous pouvons adopter une approche Xor pour résoudre ce problème :

Enfin, il y a un simple anti - opérateur bitwise :~

Objet:Inverse un nombre de bits binaires( Y compris ses bits symboliques )

Attention!: Les opérateurs de bits ci - dessus , Leurs opérandes doivent être des entiers!

1.3 Une question sur le levage intégral 

Il y a une telle chaîne de codes ,Demande.:Pourquoi?char La taille du type est 4Octets?

N'importe quel opérateur de bits, Tout est calculé par ordinateur , Et dans l'ordinateur CPUCapacité de calcul, Mais les données calculées sont en mémoire .Alors..., Faites n'importe quelle opération ,Doit obtenir les données de la mémoireCPUDans le registre de. Et la largeur d'opérande par défaut du registre est 32Bits,Mais...,charLes données de type ne sont que1Octets,C'est - à - dire8Bits,Insatisfait32Et toi?, Cela nécessite un lifting de forme !( Pour plus de détails sur l'amélioration de la forme, vous pouvez consulter les données Oh )

Si c'est un nombre signé :Bit de symbole de complément supérieur

Si c'est un nombre non signé :Supplément supérieur0


2、Déplacer l'opérateur 

2.1 À gauche.<<   À droite.>>Opérateur

<< L'opérateur de gauche est un opérateur binoculaire , La fonction est de mettre L'opération à gauche Chaque bit binaire de À gaucheSpécifier le nombre de bits.

>> L'opérateur de droite est un opérateur binoculaire , La fonction est de mettre Le nombre d'opérations à droite Chaque bit binaire de À droiteSpécifier le nombre de bits. 

Attention!:

<< À gauche.:Rejet du BIT le plus bas,Zéro au niveau le plus élevé

>> À droite.:

  1. Nombre non signé:Rejet du BIT le plus bas,Zéro au niveau le plus élevé [Déplacement logique à droite]
  2. Nombre signé:Rejet du BIT le plus bas,Bit de symbole de complément supérieur [Déplacement arithmétique à droite] 

Ce qui précède est calculé en complément

Attention:Opérateur de poste, Ne déplacez pas les chiffres négatifs ,Ceci n'est pas défini par la norme!

À gauche, on peut dire , Il faut qu'on parle un peu. :

C'est évident., C'est un déplacement à droite sous un nombre non signé , Le premier petit ami ne sera pas surpris , Mais le second est un peu confus ,Expliquons - nous.:

Il y a un problème.,Quand -1 Prêt à mettre la variable b Quand on aura besoin de voir -1Le type de?

La réponse est que! Il y a des compléments binaires en mémoire ,Essentiellement -1 Le complément est placé dans la variable b Milieu,Deuxièmement, L'opérateur de déplacement à droite appartient au calcul ,Besoin deCPUEn cours, Donc il faut d'abord mettre la mémoire -1 J'ai le supplément pour CPU Opération dans le registre ,Selon nos règles, À droite. , Nombre non signé faible rejet élevé zéro ,Alors... -1 Une fois le déplacement à droite terminé, il devient 0111 1111 ... 1111 1111, Ensuite, nous avons %d Impression intégrale signée, Et le traiter comme un nombre signé ,La position la plus élevée est 0 Donc C'est considéré comme un nombre positif , Convertir en décimale, c'est - à - dire la valeur imprimée ci - dessus .

La deuxième chose que nous allons voir est que le nombre signé se déplace à droite :

Je crois que tout le monde comprendra , Le premier bit de symbole de complément supérieur est le complément 0,Jeter bas,Donc le résultat est 0, Le deuxième bit de symbole de complément supérieur est le complément 1,Jeter bas, La valeur reste inchangée ,Toujours -1

Attention!:a>>1 Ça ne change rien a Valeur de la variable,Juste comme a + 1. C'est comme ça que ça change :a = a >> 1; 

2.2 Exercices d'exercices 

Après avoir appris les opérateurs logiques de la dernière période , Et l'opérateur de déplacement pour ce numéro , On va s'entraîner :

S'il vous plaît concevoir une macro qui peut spécifier le nombre de bits de données à changer en 1 , Et concevoir une fonction pour imprimer chaque bit . 

//RÉFÉRENCES
#define SETBIT(a, num) ((a) |= (1 << (num - 1)) )

void PrintBit(int a)
{
    int num = 31;
    while (num >= 0)
    {
        if ((a & (1 << num)))
            printf("1");
        else
            printf("0");
        --num;
    }
    printf("\n");
}

int main()
{
    int a = 0;
    SETBIT(a, 5);
    PrintBit(a);
    return 0;
}

3、++ Et -- Fonctionnement

3.1 Fonctionnement de base 

En fait, ce point de connaissance est très simple à comprendre , Mais il y a toujours des écoles qui aiment avoir des problèmes :

int i = 3; Demande.:(++i) + (++i) + (++i) Quelle est la valeur de? 

Mon conseil est, Voir ce genre de questions , Directement vide , Vous pouvez aussi ajouter une phrase ci - dessous ,“ Tu es poli??”

Cette expression, Les résultats calculés sous n'importe quel compilateur sont différents !

Il n'est pas nécessaire de se disputer sur qui a raison et qui a tort , Si quelqu'un veut te baiser , Alors dis - lui , Tu es vraiment super .

C'est bon,Revenons à nos moutons,Disons que ++ Et -- Compréhension de base:

  1. Avant++ -- : Commencez par vous - même(Moins),Réutiliser
  2. Postposition++ -- : Utilisez d'abord,Encore une fois(Moins) Si aucune variable n'est reçue,Alors, augmentez - vous directement.

Exemple:

L'utilisation de base est tellement , Ensuite, nous avons une compréhension approfondie du point de vue de l'assemblage :

3.2 Une compréhension approfondie du point de vue de l'assemblage a++

Maintenant que nous savons,Postposition++ Oui, avant utilisation++, Si on était simples ++ Une minute., Où a - t - il utilisé cette valeur ?

int main()
{
    int a = 0xDD;
    int b = a++; //Oui.bRéception,AlorsaLa première utilisation deaValeur de(Contenu),Mets - le.bMoyenne
    int c = 0xEE;
    c++; //Pas de récepteur,Alors"Utilisez d'abord",Comment comprendre?

    return 0;
}

 vs2019 Démontage du compilateur :

Conclusions:Postposition++ Le sens complet est d'utiliser d'abord,Dans l'auto - augmentation,Si aucune variable n'est reçue,Alors, augmentez - vous directement.

Attention!: Les procédures peuvent varier selon le compilateur , Mais c'est un processus de recherche fondamental , Plus rigoureux qu'un simple apprentissage théorique . 

Calm, mature and precipitated

原网站

版权声明
本文为[Les singes t'apprennent à jouer au basket.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207042033470120.html