[英]Converting bool expression to char in c#
当我遇到类似下面的问题时,我通过了.NET测验。
Char ch = Convert.ToChar('a' | 'e' | 'c' | 'a');
在控制台中我们可以看到ch
变量的输出是g
。
有人可以描述发生了什么吗? 谢谢!
“|” 是二元OR运算符。
'a' binary representation is 01100001
'e' binary representation is 01100101
'c' binary representation is 01100011
OR
的结果是01100111
,其char表示为g
这不是第一个看起来的样子。 它更多的是对这些Char
的int
表示的二进制计算:
这是一篇完整的文章,用例子解释这个: 文章
所以这些'a' | 'e' | 'c' | 'a'
的按位Or
的二进制结果 'a' | 'e' | 'c' | 'a'
'a' | 'e' | 'c' | 'a'
是103
。 如果将其转换为Char,则为g
编辑:
虽然我应该得到更多细节,但我认为这个答案比我更受关注。
有一个从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'
二进制'c'
十进制值是99 ,它是01100011
。 'a'
十进制值是二进制的97 ,它是01100001
。 或者操作员按位'|'
。 所以你的表达式等于:
01100001
或
01100101
或
01100011
或
01100001
,结果是
01100111
或业绩1,如果有至少一次1列。
01100001
转换为十进制是103 。
我们将再次访问unicode-table ,我们将看到deciaml中的103等于'g'
。
所以你问这个函数做了什么,它计算二进制值然后将它转换为Decimal值并返回它的unicode字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.