examples comando c# clr

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 es 01100001 .
  • ''e'' valor decimal es 101 en binario es 01100101 .
  • ''c'' valor decimal es 99 en binario es 01100011 .
  • ''a'' valor decimal es 97 en binario es 01100001 .

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 .