J’ai réussi le quiz .NET lorsque j’ai rencontré une question comme celle ci-dessous.
Char ch = Convert.ToChar('a' | 'e' | 'c' | 'a');
Dans la console, nous pouvons voir que la sortie de la variable ch
est g
.
Quelqu’un peut-il décrire ce qui se passe? Merci!
Ce n’est pas ce que cela ressemble à la première place. Il s’agit plus de calculs binarys sur la représentation int
de ces caractères:
Voici un article complet expliquant cela avec des exemples: Article
Donc, le résultat binary pour le bit Or
de ces 'a' | 'e' | 'c' | 'a'
'a' | 'e' | 'c' | 'a'
'a' | 'e' | 'c' | 'a'
est 103
. Si vous convertissez cela en caractères, g
Modifier:
Je vois que cette réponse a pris plus d’attention que je pensais qu’elle méritait plus de détails.
Il y a une conversion implicite de char en int ( int i = 'a'
comstack), le compilateur fait donc ce qui suit:
Convert.ToChar((int)'a' | (int)'e' | (int)'c' | (int)'a');
Comme ce sont des valeurs codées en dur, le compilateur fait plus de travail:
Convert.ToChar(97 | 101 | 99 | 97);
et enfin:
Convert.ToChar(103); // g
S’il ne s’agissait pas de valeurs codées en dur:
private static char BitwiseOr(char c1, char c2, char c3, char c4) { return Convert.ToChar(c1 | c2 | c3 | c4); }
En utilisant Roslyn, vous obtenez:
private static char BitwiseOr(char c1, char c2, char c3, char c4) { return Convert.ToChar((int)c1 | c2 | c3 | c4); }
Conversion en instruction IL ( or
instruction IL (bit à bit) utilisée):
.method private hidebysig static char BitwiseOr(char c1, char c2, char c3, char c4) cil managed { // .maxstack 2 .locals init (char V_0) IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 IL_0003: or IL_0004: ldarg.2 IL_0005: or IL_0006: ldarg.3 IL_0007: or IL_0008: call char [mscorlib]System.Convert::ToChar(int32) IL_000d: stloc.0 IL_000e: br.s IL_0010 IL_0010: ldloc.0 IL_0011: ret } // end of method Program::BitwiseOr
“|” est l’opérateur OU binary.
'a' binary representation is 01100001 'e' binary representation is 01100101 'c' binary representation is 01100011
Le résultat de l’ OR
est 01100111
, dont la représentation de caractère est g
Aller à la table unicode .
'a'
valeur décimale est 97 en binary, c’est 01100001
. 'e'
valeur décimale est 101 en binary, c’est 01100101
. 'c'
valeur décimale est 99 en binary, c’est 01100011
. 'a'
valeur décimale est 97 en binary, c’est 01100001
. Ou l’ opérateur en termes de bits est '|'
. Donc, votre expression est égale à:
01100001
OU
01100101
OU
01100011
OU
01100001
et le résultat obtenu est
01100111
.
Ou donne 1 s’il y a au moins une heure 1 dans la colonne.
01100001
conversion en décimal est 103 .
Nous allons revenir à la table unicode et nous verrons que 103 en déciaml est égal à 'g'
.
Alors vous avez demandé ce que cette fonction fait, elle calcule la valeur binary, puis la convertit en valeur décimale et en renvoie le caractère unicode .