Ответ 1
Это не то, что кажется на первом месте. Это больше бинарных вычислений в представлении int
этих Char
:
Вот полная статья, объясняющая это примерами: Article
Таким образом, двоичный результат для побитового Or
этих 'a' | 'e' | 'c' | 'a'
равен 103
. Если вы преобразуете это значение в Char, это g
Edit:
Я вижу, что этот ответ занял больше внимания, чем я, хотя он заслуживает более подробной информации.
С С# Компилятор:
Существует неявное преобразование из char в int (int i = 'a'
компиляции), поэтому на самом деле компилятор:
Convert.ToChar((int)'a' | (int)'e' | (int)'c' | (int)'a');
Поскольку это жестко закодированные значения, компилятор делает больше работы:
Convert.ToChar(97 | 101 | 99 | 97);
и, наконец:
Convert.ToChar(103); // g
Если это не были жестко заданные значения:
private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
return Convert.ToChar(c1 | c2 | c3 | c4);
}
Используя Roslyn, вы получаете:
private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
return Convert.ToChar((int)c1 | c2 | c3 | c4);
}
Преобразован в IL (Or
(побитовое) использование команды IL):
.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