c#中将bool表达式转换为char
本文关键字:char 转换 表达式 中将 bool | 更新日期: 2023-09-27 17:54:20
当我遇到下面这样的问题时,我通过了。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
(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
OR01100101
OR01100011
OR01100001
,结果是
01100111
。
或 results 1,如果列中至少有一次1。
01100001
转换成Decimal是103。
我们将再次访问unicode表,我们将看到103在十进制中等于'g'
。
所以你问这个函数做什么,它计算二进制值然后转换为十进制值并返回它的unicode字符