关于我的C代码中的AND或OR操作的说明

时间:2013-05-16 11:56:22

标签: c# logical-operators

我正在尝试分析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操作会发生什么。

2 个答案:

答案 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”(|)用于从其各部分组成数字。