在 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
'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 字符。
当我遇到如下问题时,我通过了 .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
'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 字符。