我正在尝试分析C#中的一些代码。我对转换数字有一些误解的问题,可能在C#代码中使用AND操作。我的代码如下所示。
public void SerialNumber(UInt32 number)
{
_sensorNumber=0;
if (number == 0)
number = (UInt32)(USB.Id << 16) | (_sensorNumber << 10) | 1;
SerialNumber = string.Format("{0}-{1}-{2}",
(number & 0xFFFF0000) >> 16,
(number & 0x0000FC00) >> 10,
number & 0x000003FF);
}
任何人都可以清楚地向我解释这段代码的作用吗?我需要在“SerialNumber”行中进行解释。 当我试图调试这段代码时,我观察到两种不同的情况。
1)当我的号码= 65668097; 然后我得到“SerialNumber = 1002-0-1
2)当我的数字= 0时; 它正在获得USB.Id = 15152;之后我不明白正在进行什么操作然后最终编号= 993001473 然后我得到“SerialNumber = 15152-0-1
请任何人解释一下AND,OR操作会发生什么。
答案 0 :(得分:2)
&
和|
分别是逻辑和以及或。这意味着,如果您使用两个数字执行此操作,则会对它们的位表示进行逻辑比较,并获得结果。 E.g:
101011和110010 = 100010
101011或110010 = 111011
>>
是一个位移位运算符,后面的数字表示你应该执行多少次移位。您可以在此处阅读:http://www.blackwasp.co.uk/CSharpShiftOperators.aspx
我希望它能帮助你开始。
修改强>: 万一你不知道。 0xFFFF0000是数字的十六进制表示。更多相关信息:http://en.wikipedia.org/wiki/Hexadecimal
答案 1 :(得分:0)
您可能希望以十六进制格式查看数字以更好地理解该代码。
序列号(作为数字或字符串)是3种不同的组合(编码为单个整数):USB ID,传感器编号和......其他内容。 USB Id占用前16位,传感器编号占下一位6位,最后一位占10位(16 + 10 + 6 = 32位= sizeof(UInt32)):0xFFFF0000是前16位的掩码(0xFFFF) = 2 ^ 16-1),0xFC00用于下一个6,0x3FF用于最后10位(0x3FF = 1023 = 2 ^ 10-1,0xFFFF = 0xFC00 + 0x3FF)。
简而言之,“按位AND”(&amp;)用于将三个部分与完整整数分开,“按位OR”(|)用于从其各部分组成数字。