1

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

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。我在这里缺少什么?我是否使用了不正确的运算符?

4

7 回答 7

4

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

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

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

于 2009-06-16T15:39:45.613 回答
3

第一个片段的等效函数是:

return theByte & 1 == 1

在第二个片段中,您是最重要的位,而在第一个片段中是最不重要的。

于 2009-06-16T15:43:10.800 回答
1

你想返回int还是string?无论如何-您可以使用模数:

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

好的,你编辑了......并且想要返回 int

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

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

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

于 2009-06-16T15:43:23.843 回答
0

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

于 2009-06-16T15:34:42.783 回答
0

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

你确定你的订单正确吗?二进制传统上是从右到左书写的,而不是像大多数其他编号系统那样从左到右书写。如果您显示的二进制数是属性格式的(这意味着这10000000实际上是 number128而不是 number 1),那么您的第一个代码片段应该不起作用,而第二个应该起作用。如果你倒着写(意思100000001,不是128),那么你甚至不需要移位。只需将其与 1 ( theByte & 1) 相加。

事实上,无论采用哪种方法,按位 AND(&运算符)似乎更合适。鉴于您的第一个功能有效而第二个无效,我假设您只是将数字倒写并需要与 1 进行 AND 运算,如上所述。

于 2009-06-16T15:38:28.627 回答
0

根据微软网站上的一位用户的说法, BitArray 在内部以大端顺序将位存储到 Int32 中。这可能会导致问题。有关解决方案和更多信息,您可以访问该链接。

于 2009-06-16T15:38:46.847 回答
0

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

但你可能想要的是:

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

但是,您可能还想要这个:

    private static string ParseByteB(byte theByte)
    {
        return (theByte & 1).ToString();
    }
于 2009-06-16T15:43:20.053 回答