代码之家  ›  专栏  ›  技术社区  ›  scottm

C中的比特移位混淆#

  •  1
  • scottm  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  4
  •   Dustin Campbell    16 年前

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

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

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

        2
  •  3
  •   albertein    16 年前

    return theByte & 1 == 1
    

    在第二次狙击中,你被选中了最有意义的位置,在第一次狙击中你被选中的位置最不重要。

        3
  •  1
  •   tanascius    16 年前

    您想返回int还是string?不管怎样,你可以使用模:

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

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

    关于你的轮班操作:你必须使用<<而不是>>。但这将返回(当您转换为byte而不是int时)0或128,而不是0或1。因此,您可以将第二个解决方案改写为:

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

        4
  •  0
  •   Ankur Goel    16 年前

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

        5
  •  0
  •   Adam Robinson    16 年前

    你的二进制数中有一个额外的零(每个数字有9位)。我想那只是个打字错误。

    你确定你点的菜正确吗?二进制传统上是从右向左写的,不像大多数其他编号系统那样从左向右写。如果您显示的二进制数是属性格式的(这意味着 10000000 真的是这个数字吗 128 而不是数字 1 )那么你的第一个代码片段不应该工作,第二个应该工作。如果你把它倒过来写(意思 10000000 1. ,不 128 ),那么你甚至不需要改变位置。只是和它1( theByte & 1 ).

    事实上,无论采用哪种方法,按位AND( & 操作员)似乎更合适。假设你的第一个函数有效,第二个函数无效,我假设你只是把数字倒过来写,需要如上所述用1与之and。

        6
  •  0
  •   merkuro    16 年前

    据某用户介绍 Microsoft's site BitArray内部按照比特顺序将比特存储到大端序的Int32s中。这可能会导致问题。有关解决方案和更多信息,请访问链接。

        7
  •  0
  •   Martin Brown    16 年前

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

    但你可能想要的是:

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

    但是,您可能也希望这样:

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