C#中的位移混淆

时间:2009-06-16 15:31:19

标签: c# bit-shift

我有一些像这样的旧代码:

private int ParseByte(byte theByte)
{
        byte[] bytes = new byte[1];
        bytes[0] = theByte;
        BitArray bits = new BitArray(bytes);

        if (bits[0])
            return 1;
        else
            return 0;
}

这很长,我想我可以这样修剪下来:

private int ParseByte(byte theByte)
{
         return theByte >> 7;
}

但是,我没有得到与第一个函数相同的值。该字节包含00000000或10000000.我在这里缺少什么?我使用的是不正确的算子吗?

7 个答案:

答案 0 :(得分:4)

问题在于,在第一个函数中,bits [0]返回最低有效位,但第二个函数返回最高有效位。要修改第二个函数以获得最低有效位:

private int ParseByte(byte theByte)
{
    return theByte & 00000001;
}

要修改第一个函数以返回最高有效位,应使用位[7] - 而不是位[0]。

答案 1 :(得分:3)

第一个snipet的等效函数是:

return theByte & 1 == 1

在第二个snipet中,你是最有意义的位,而在第一个snipet中,它是最不重要的。

答案 2 :(得分:1)

你想返回int还是字符串?无论如何 - 你可以使用modulo:

return theByte % 2 == 0 ? "0" : "1"

好的,你编辑了......并希望返回int

转换操作的一句话:你必须使用<<而不是>>。但是这会返回(当你转换为byte而不是int时)0或128而不是0或1.所以你可以将第二个解决方案重写为:

return (byte)(theByte << 7) == 128 ? 1 : 0;

但其他答案包含的解决方案确实比这更好。

答案 3 :(得分:0)

也许第一个函数应检查位[7]?

答案 4 :(得分:0)

您的二进制数字中有一个额外的零(每个都有9位数字)。我假设这只是一个错字。

你确定你正确地订购了吗?二进制传统上是从右到左书写的,而不像大多数其他编号系统那样从左到右书写。如果您显示的二进制数字是属性格式的(意味着10000000实际上是数字128而不是数字1),那么您的第一个代码段应该不起作用,第二个应该是。如果你向后写(意味着100000001,而不是128),那么你甚至不需要比特移位。只需和它1(theByte & 1)。

实际上,无论方法如何,按位AND(&运算符)似乎更合适。鉴于你的第一个函数是有效的,而第二个函数没有,我假设你只是向后写了数字,并且如上所述需要将它与1进行对比。

答案 5 :(得分:0)

根据Microsoft's site上的用户,BitArray内部按位顺序将这些位存储为大端的Int32。这可能会导致问题。有关解决方案和更多信息,请访问该链接。

答案 6 :(得分:0)

1st第一个函数不起作用,因为它试图返回一个字符串而不是一个int。

但你可能想要的是:

    private static int ParseByte(byte theByte)
    {
        return theByte & 1;
    }

但是你可能也想要这个:

    private static string ParseByteB(byte theByte)
    {
        return (theByte & 1).ToString();
    }
相关问题