使用bitarray获取位并构建新值

时间:2011-08-17 20:26:22

标签: c# bitarray

如果我取一个uint值= 2921803(0x2C954B),这实际上是一个4字节的包(4B 95 2C 00) 我想用bitarray得到它的字节版本的16个最低有效位,我该怎么做呢?

这就是我尝试这样做的方式:

byte[] bytes = BitConverter.GetBytes(value);  //4B 95 2C 00  - bytes are moved around
BitArray bitArray = new BitArray(bytes); //entry [0] shows value for 1101 0010 (bits are reversed)

此时,我全都转过身来。我试过这个:

byte[] bytes = BitConverter.GetBytes(value);

Array.Reverse(bytes);
BitArray bitArray = new BitArray(bytes);

这给了我所有的位但完全颠倒了,从[31]到[0]读取。 最终,我期待/希望得到19349(4B 95)作为我的答案。

这就是我希望实现该功能的方式:

private uint GetValue(uint value, int bitsToGrab, int bitsToMoveOver)
{
    byte[] bytes = BitConverter.GetBytes(value);
    BitArray bitArray = new BitArray(bytes);

    uint outputMask = (uint)(1 << (bitsToGrab - 1));
    //now that i have all the bits, i can offset, and grab the ones i want
    for (int i = bitsToMoveOver; i < bitsToGrab; i++)
    {
        if ((Convert.ToByte(bitArray[i]) & 1) > 0)
        {
            outputVal |= outputMask;
        }

        outputMask >>= 1;
   }

}

2 个答案:

答案 0 :(得分:3)

0x2C954B的16个最低有效位是0x954B。您可以按如下方式获得:

int value = 0x2C954B;

int result = value & 0xFFFF;
// result == 0x954B

如果你想要0x4B95,那么你可以按如下方式获得:

int result = ((value & 0xFF) << 8) | ((value >> 8) & 0xFF);
// result == 0x4B95

试试这个:

uint value = 0x002C954Bu;

int reversed = Reverse((int)value);
// reversed == 0x4B952C00;

int result = Extract(reversed, 16, 16);
// result == 0x4B95

int Extract(int value, int offset, int length)
{
    return (value >> offset) & ((1 << length) - 1);
}

int Reverse(int value)
{
    return ((value >> 24) & 0xFF) | ((value >> 8) & 0xFF00) |
           ((value & 0xFF00) << 8) | ((value & 0xFF) << 24);
}

答案 1 :(得分:1)

单位 - 32位 基本上你应该将16个最高有效位设置为零,所以使用按位AND运算符:

uint newValue = 0x0000FFFF & uintValue;