0

作为输入,我得到一个 int(好吧,实际上是一个我应该转换为 int 的字符串)。
此 int 应转换为位。
对于每个具有 1 的位位置,我应该得到该位置。
在我的数据库中,我想要所有具有 int 值字段的记录,该字段将此位置作为值。
我目前有以下幼稚的代码,它应该询问我的实体(持有 databaseValue)是否与位置匹配,但显然不能正常工作:

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

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

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

任何帮助,将不胜感激

4

3 回答 3

4

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

for (int i=0; i < 32; i++)
{
    if ((value & (1 << i)) != 0)
    {
        Console.WriteLine("Bit {0} was set!", i);
    }
}
于 2008-12-17T15:44:31.887 回答
4

你的感觉是对的。这应该用位掩码解决。BitConverter 不返回位(它怎么可能?“位”不是实际的数据类型),它将原始字节转换为 CLR 数据类型。每当您想从某些东西中提取位时,您应该考虑位掩码。

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

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

如果您只想查看是否在 int 中设置了某个位,您可以使用一个仅包含您要检查的位的数字(即 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;
}
于 2008-12-17T16:00:28.063 回答
1

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

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

于 2008-12-17T15:46:23.473 回答