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 .