c#中将bool表达式转换为char

本文关键字:char 转换 表达式 中将 bool | 更新日期: 2023-09-27 17:54:20

当我遇到下面这样的问题时,我通过了。net测试。

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

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

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

c#中将bool表达式转换为char

"|"为二进制或运算符。

'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 (Bitwise) 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 OR
01100101 OR
01100011 OR
01100001,结果是
01100111

results 1,如果列中至少有一次1

01100001转换成Decimal是103
我们将再次访问unicode表,我们将看到103在十进制中等于'g'

所以你问这个函数做什么,它计算二进制值然后转换为十进制值并返回它的unicode字符