当前位置:网站首页>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.】

You wangt somenthing, go get it!
Table des matières
1.1 Bitwise or ( | ) Et Bitwise vs. ( & )
1.3 Une question sur le levage intégral
2.1 À gauche.<< À droite.>>Opérateur
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.:
- Nombre non signé:Rejet du BIT le plus bas,Zéro au niveau le plus élevé [Déplacement logique à droite]
- 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:
- Avant++ -- : Commencez par vous - même(Moins),Réutiliser
- 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
边栏推荐
猜你喜欢
随机推荐
y56.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(二九)
Huawei ENSP simulator layer 3 switch
福昕PDF编辑器v10.1.8绿色版
Golang中UTF编码和字符集
Minidom module writes and parses XML
Jerry's ad series MIDI function description [chapter]
杰理之增加进关机前把触摸模块关闭流程【篇】
numpy vstack 和 column_stack
Nmap scan
Redis:Redis配置文件相关配置、Redis的持久化
Roast B station charges, is it because it has no money?
colResizable.js自动调整表格宽度插件
maya灯建模
FastDfs的快速入门,三分钟带你上传下载文件到云服务器
创客思维在高等教育中的启迪作用
宝塔 7.9.2 宝塔控制面板绕过 手机绑定认证 绕过官方认证
Actual combat simulation │ JWT login authentication
redis事务
redis RDB AOF
HWiNFO硬件检测工具v7.26绿色版









