当前位置:网站首页>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
边栏推荐
猜你喜欢
Solution of 5g unstable 5g signal often dropped in NetWare r7000 Merlin system
Jerry added the process of turning off the touch module before turning it off [chapter]
Jmeter 之压测入门
D3.js+Three.js数据可视化3d地球js特效
IIC (STM32)
Huawei ENSP simulator enables devices of multiple routers to access each other
Render function and virtual DOM
偷窃他人漏洞报告变卖成副业,漏洞赏金平台出“内鬼”
华为ensp模拟器实现通信安全(交换机)
Can be displayed in CAD but not displayed in print
随机推荐
Google colab踩坑
Jerry's ad series MIDI function description [chapter]
LambdaQueryWrapper用法
FastDfs的快速入门,三分钟带你上传下载文件到云服务器
Gobang go to work fishing tools can be LAN / man-machine
Why does invariant mode improve performance
PS竖排英文和数字文字怎么改变方向(变竖直显示)
迈动互联中标北京人寿保险
Jmeter 之压测入门
Jerry's ad series MIDI function description [chapter]
软件开发过中的采购
Configuration of DNS server of Huawei ENSP simulator
Word文档中标题前面的黑点如何去掉
巅峰不止,继续奋斗!城链科技数字峰会于重庆隆重举行
股票开户佣金最低多少,炒股开户佣金最低网上开户安全吗
render函数与虚拟dom
解析互联网时代的创客教育技术
Daily question -leetcode1200- minimum absolute difference - array - sort
Solution of 5g unstable 5g signal often dropped in NetWare r7000 Merlin system
IIC (STM32)