在 C# 中将 bool 表达式转换为 char

Converting bool expression to char in c#

当我遇到如下问题时,我通过了 .NET 测验。

Char ch = Convert.ToChar('a' | 'e' | 'c' | 'a');

在控制台中我们可以看到 ch 变量的输出是 g.

有人能描述一下发生了什么吗? 谢谢!

"|"是二元或运算符。

'a' binary representation is 01100001
'e' binary representation is 01100101
'c' binary representation is 01100011

OR的结果是01100111,其字符表示是g

这不是第一眼看到的样子。更多的是对这些 Char:

int 表示的二进制计算

这是一篇完整的文章,通过示例对此进行了解释:Article

所以这些'a' | 'e' | 'c' | 'a'的按位Or的二进制结果是103。如果将其转换为 Char,则为 g

编辑:

我看到这个答案比我更受关注,尽管它值得更多的细节。

来自 C# 编译器端:

存在从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

转到unicode-table

  • 'a' 十进制值为 97 二进制为 01100001.
  • 'e' 十进制值为 101 二进制为 01100101.
  • 'c' 十进制值为 99 二进制为 01100011.
  • 'a' 十进制值为 97 二进制为 01100001.

位运算符是'|'。 所以你的表达式等于:

01100001
01100101
01100011
01100001 结果是
01100111.

Or 如果列中至少有一次 1,则结果为 1

01100001 转换为十进制是 103.
我们将再次转到 unicode-table,我们将看到 deciaml 中的 103 等于 'g'.

所以你问那个函数是做什么的,它计算二进制值然后将其转换为十进制值和 returns 它的 unicode 字符。