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

当我遇到类似下面的问题时,我通过了.NET测验。

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

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

有人可以描述发生了什么吗? 谢谢!

这不是第一次看起来的样子。 它更多的是对这些Charint表示的二进制计算:

这是一篇完整的文章,用例子解释这个: 文章

所以这些'a' | 'e' | 'c' | 'a'的按位Or的二进制结果 'a' | 'e' | 'c' | 'a' 'a' | 'e' | 'c' | 'a'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); } 

转换为ILor (按位)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 

“|” 是二元OR运算符。

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

OR的结果是01100111 ,其char表示为g

转到unicode-table 。

  • 'a'十进制值是二进制的97 ,它是01100001
  • 'e'十进制值是二进制的101 ,它是01100101
  • 'c'二进制'c'十进制值是99 ,它是01100011
  • 'a'十进制值是二进制的97 ,它是01100001

或者操作员按位'|' 。 所以你的表达式等于:

01100001
01100101
01100011
01100001 ,结果是
01100111

如果列中至少有一个时间1 ,则结果为1

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

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