使用&运算符对两个字符进行按位与运算的原理咨询
按位与运算符在C# char类型中的工作原理解析
让我一步步帮你拆解这个运算过程,搞清楚为什么'ࡴ' & 'a'会得到`这个结果:
1. 先明确C#中char的本质
C#的char类型是16位的UTF-16编码单元,所以计算按位与时,是基于字符的UTF-16二进制值,而不是你提到的UTF-8编码。我们先把两个字符转成对应的UTF-16二进制:
- 字符
'a'的Unicode码点是U+0061,UTF-16值就是0x0061,二进制为:00000000 01000001 - 字符
'ࡴ'的Unicode码点是U+0874,它属于BMP(基本多语言平面),所以UTF-16是单个编码单元0x0874,二进制为:00001000 01110100
2. 按位与运算符&的规则
按位与是对两个数的每一位独立运算,规则非常简单:
只有当两个数的对应位都为1时,结果的该位才是1;否则为0。
3. 实际计算过程
我们把两个UTF-16的二进制对齐,逐位进行按位与:
00001000 01110100 // 'ࡴ'的UTF-16二进制 (0x0874) & 00000000 01000001 // 'a'的UTF-16二进制 (0x0061) ----------------- 00000000 01000000 // 运算结果的二进制,对应十六进制0x0060
4. 结果对应的字符
Unicode码点U+0060对应的字符就是反引号,所以Console.WriteLine`输出的就是这个字符。
补充:为什么你的UTF-8编码没用到?
你提到的'ࡴ'的UTF-8编码(11100000:10100001:10110100)是它在存储或传输时的编码格式,但C#在内存中存储char时用的是UTF-16,所以计算按位与时只会使用UTF-16的二进制值,这一点要注意区分哦。
你的测试代码回顾
char comp58 = 'a'; char comp96 ='\u0874'; Console.WriteLine(comp96&=comp58);
内容的提问来源于stack exchange,提问作者Eric Movsessian
相关产品推荐
相关产品推荐

