2

好的,有个问题。我已经为选项组装了一个位掩码。基本上我的页面有一个列表框,允许多个选择将它们存储在整数列表(它们的 ID 值)中。总共有 14 个选择(所以 ID val 1-15)。我将它组装成位掩码的原因是因为我不想在数字中硬编码,以防我想向数据库表(列表框从中填充)添加选项。此外,我不想将 14 个参数发送到我的 SQL 存储过程(因此硬编码为数字 14)。我可以发送这个整数并解构它(稍后的步骤)。

但是,由于另一个原因,现在我需要找出在我的整数中设置了哪些位。基本上我有财产。get 从整数列表(从用户选择中获得)中组装位掩码,并返回该二进制十进制值的整数。这是我用于构建位掩码的汇编代码。

//optsNum is my integer list. This is the list containing the ID nums of the selections.
//so if the user selects the first, second, and fourth option, the list contains 1,2,4 (count 3)
//typeCount is an integer of the amount of options in the list box
int total = 0;
for (int c = 0; c < optsNum.Count(); ++c)
{
    for (int i = 0; i <= typeCount; i++)
    {
        if ((i + 1) == optsNum[c})
            total += (1 << i);
    }
}
return total;

因此,如果设置了第一个、第二个和第四个,我的整数是 11。这有效,我测试了所有选择,它返回正确的整数/十进制值。

现在我需要帮助来制定我的设置方法。这需要获取我拥有的十进制/整数,找出设置了哪些位并将它们放回列表中。所以如果我有 11 作为我的值,我需要放入一个整数列表 1,2,4。有谁能够帮助我?

4

1 回答 1

4

您应该改用BitArray该类;它为您执行按位运算,并具有简单的界面。
如果你永远不需要超过 32 个布尔值,你也可以使用更小的BitVector32


要回答您的问题,您需要遍历每一位(使用简单的 afor循环)并检查value & (1 << i)是否i设置了第 th 位。

于 2010-11-24T15:24:58.073 回答