English 中文(简体)
为什么BitConverter返回字节,我如何获取位?
原标题:
  • 时间:2008-12-17 15:40:50
  •  标签:

As input I get an int (well, actually a string I should convert to an int).
This int should be converted to bits.
For each bit position that has a 1, I should get the position.
In my database, I want all records that have an int value field that has this position as value.
I currently have the following naive code that should ask my entity(holding the databaseValue) if it matches the position, but obviously doesn t work correctly:

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

Firstly, I have an array of byte because there apparantly is no bit type. Should I use Boolean[] ? Then, how can I fill this array? Lastly, if previous statements are solved, I should just return bits[position]

我觉得这个问题应该用位掩码来解决,但是我不知道该从哪里开始。

任何帮助都会感激不尽。

最佳回答

你的感觉是正确的。这应该使用位掩码来解决。BitConverter不返回比特(而它怎么可能?“比特”不是一个实际的数据类型),它把原始字节转换成CLR数据类型。每当你想从某个东西中提取出比特时,你应该想到位掩码。

如果您想检查某个位置上的位是否已设置,请使用 & 运算符。位运算 & 仅在两个位都设置时为真。例如,如果您有两个字节 109 和 33,则 & 的结果将是:

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

如果你只想查看一个整数中是否设置了某个位,你可以使用一个只有你要检查的那一位被设置的数字(如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;
}
问题回答

我猜想 BitArray 是你需要的。另外,使用位掩码也不难:

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

不要使用布尔值。尽管布尔值只有两个值,但它实际上像int一样使用32位存储。

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





相关问题
热门标签