c# - comando - awk unix
Convertir la expresión bool a char en c# (3)
"|" Es el operador binario OR.
''a'' binary representation is 01100001
''e'' binary representation is 01100101
''c'' binary representation is 01100011
El resultado del OR es 01100111 , cuya representación char es g
Pasé el cuestionario .NET, cuando encontré una pregunta como la siguiente.
Char ch = Convert.ToChar(''a'' | ''e'' | ''c'' | ''a'');
En la consola podemos ver que la salida para la variable ch es g .
¿Puede alguien describir lo que está pasando? ¡Gracias!
Esto no es lo que parece en primer lugar. Es más de cálculos binarios en la representación int de estos Char :
Aquí hay un artículo completo que explica esto con ejemplos: Article
Así que el resultado binario para el bit a bit Or de estos ''a'' | ''e'' | ''c'' | ''a'' ''a'' | ''e'' | ''c'' | ''a'' ''a'' | ''e'' | ''c'' | ''a'' es 103 . Si usted convierte eso a Char, es g
Editar:
Veo que esta respuesta tomó más atención que yo, aunque merece más detalles.
Desde el lado del compilador C #:
Hay una conversión implícita de char a int (compilaciones int i = ''a'' ), así que lo que realmente hace el compilador es:
Convert.ToChar((int)''a'' | (int)''e'' | (int)''c'' | (int)''a'');
Dado que estos son valores codificados, el compilador hace más trabajo:
Convert.ToChar(97 | 101 | 99 | 97);
y finalmente:
Convert.ToChar(103); // g
Si estos no fueran valores codificados:
private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
return Convert.ToChar(c1 | c2 | c3 | c4);
}
Usando Roslyn obtienes:
private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
return Convert.ToChar((int)c1 | c2 | c3 | c4);
}
Se convirtió a IL ( or (en modo de bit) IL instrucción utilizada):
.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
Ir a unicode-table .
-
''a''valor decimal es 97 en binario es01100001. -
''e''valor decimal es 101 en binario es01100101. -
''c''valor decimal es 99 en binario es01100011. -
''a''valor decimal es 97 en binario es01100001.
O operador en poco es ''|'' . Entonces tu expresión es igual a:
01100001 O
01100101 O
01100011 O
01100001 y el resultado de esto es
01100111 .
O resulta 1 si hay al menos una vez 1 en la columna.
01100001 conversión a Decimal es 103 .
Volveremos a la unicode-table y veremos que 103 en deciaml es igual a ''g'' .
Entonces, usted preguntó qué hace esa función, calcula el valor binario, luego lo convierte en valor decimal y devuelve el carácter Unicode .