0

我正在尝试分析 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);
    }

谁能清楚地解释我这段代码的作用?我需要在“序列号”行中进行解释。当我尝试调试这段代码时,我观察到两种不同的情况。

1)当我有数字= 65668097时;然后我得到“序列号 = 1002-0-1

2)当我有数字= 0时;它得到 USB.Id = 15152; 之后我不明白正在发生什么操作然后最后 number= 993001473 然后我得到“SerialNumber = 15152-0-1

请任何人都可以向我解释 AND,OR 操作发生了什么。

4

2 回答 2

2

&|分别是逻辑。这意味着如果你用两个数字来做,它们的位表示会在逻辑上进行比较,然后你就会得到结果。例如:

101011 和 110010 = 100010

101011 或 110010 = 111011

>>是一个移位运算符,后面的数字告诉您应该执行多少次移位。你可以在这里阅读:http: //www.blackwasp.co.uk/CSharpShiftOperators.aspx

我希望它能帮助你开始。

编辑:如果你不知道。0xFFFF0000 是数字的十六进制表示。更多信息在这里:http ://en.wikipedia.org/wiki/Hexadecimal

于 2013-05-16T12:02:00.077 回答
0

您可能希望查看十六进制格式的数字以更好地理解该代码。

序列号(作为数字或字符串)是 3 种不同事物的组合(以单个整数编码):USB ID、传感器编号和……其他事物。USB Id 占据前 16 位,传感器编号在接下来的 6 位,最后一部分位于 10 位(16+10+6 = 32 位 = sizeof(UInt32)):0xFFFF0000 是前 16 位的掩码(0xFFFF = 2^16-1),接下来 6 位为 0xFC00,最后 10 位为 0x3FF (0x3FF = 1023 = 2^10 - 1, 0xFFFF = 0xFC00 + 0x3FF)。

简而言之,“按位与”(&) 用于将三个部分与完整整数分开,“按位或”(|) 用于将数字与其部分组合起来。

于 2013-05-16T12:18:49.340 回答