为什么BitConverter会返回Bytes,那我怎么能得到这些位呢?

时间:2008-12-17 15:40:51

标签: c# bit-manipulation bit-masks

作为输入,我得到一个int(好吧,实际上是一个我应该转换为int的字符串) 这个int应该转换为位 对于每个具有1的位位置,我应该得到位置 在我的数据库中,我希望所有具有int值字段的记录都具有此位置作为值 我目前有以下天真的代码,如果它与位置匹配,应该询问我的实体(持有databaseValue),但显然无法正常工作:

Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);

首先,我有一个字节数组,因为它显然没有位类型。我应该使用Boolean []吗? 然后,我该如何填充这个数组呢? 最后,如果先前的语句被解决,我应该只返回位[位置]

我觉得这应该以某种方式用位掩码解决,但我不知道从哪里开始..

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:4)

我怀疑BitArray就是你所追求的。或者,自己使用位掩码并不难:

for (int i=0; i < 32; i++)
{
    if ((value & (1 << i)) != 0)
    {
        Console.WriteLine("Bit {0} was set!", i);
    }
}

答案 1 :(得分:4)

你的感觉是正确的。这应该用位掩码解决。 BitConverter不返回位(它怎么可能?“位”不是实际数据类型),它将原始字节转换为CLR数据类型。无论什么时候你想从某些东西中提取出来的东西,你都应该考虑使用bitmasks。

如果要检查某个位置是否设置了某个位置,请使用&amp;运营商。按位&amp;仅当两个位都置位时才为真。例如,如果您有两个字节109和33,则结果为&amp;会是

  0110 1101
& 0010 0001
-----------
  0010 0001

如果你只是想看看是否在int中设置了一个位,你和&amp;它的数字只有你正在检查的位(即1,2,4,8,16,32等),并检查结果是否为零。

List<int> BitPositions(uint input) {
    List<int> result = new List<int>();
    uint mask = 1;
    int position = 0;
    do {
        if (input & mask != 0) {
            result.Add(position);
        }
        mask <<= 1;
        position++;
    } while (mask != 0);

    return result;
}

答案 2 :(得分:1)

不要使用布尔值。虽然boolean只有两个值,但它实际上是使用32位存储的,如int。

编辑:实际上,在数组形式中,布尔值将打包成字节,而不是4个字节。