查找整数的设置位

时间:2010-11-24 15:22:32

标签: c# binary decimal bitmask

好的,有个问题。我已经为选项组装了一些掩码。基本上我的页面有一个列表框,允许多个选择将它们存储在整数列表中(它们的ID值)。共有14种选择(因此ID为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.这是有效的,我测试了所有选择,它返回正确的整数/十进制值。

现在我需要帮助制作我的set方法。这需要取我所拥有的十进制/整数,找出设置的位并将它们放回列表中。因此,如果我有11作为我的值,我需要输入整数列表1,2,4。有人能帮助我吗?

1 个答案:

答案 0 :(得分:4)

您应该使用BitArray class代替;它为您执行按位操作,并具有简单的界面 如果您永远不需要超过32个布尔值,您也可以使用更小的BitVector32 class


要回答您的问题,您需要循环每一位(使用简单的for循环)并检查value & (1 << i)以查看i位是否已设置。