【问题标题】:Finding set bits of an integer查找整数的集合位
【发布时间】:2011-05-15 04:21:13
【问题描述】:

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

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

【问题讨论】:

标签: c# binary decimal bitmask


【解决方案1】:

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


要回答您的问题,您需要遍历每一位(使用简单的 for 循环)并检查 value &amp; (1 &lt;&lt; i) 以查看是否设置了 ith 位。

【讨论】:

  • 是否有返回位置而不是位值?例如,我正在做你所说的。位置 1,2,4 已设置(值 1,2,8)。但是,我需要他们返回职位……而不是该职位的价值。所以我需要我的新数组列出 1 2 4 而不是 1 2 8。
  • 没关系,我是个白痴。我可以将我在循环中的位置添加到我的列表中。哇!头疼得厉害,我的大脑不想在感恩节假期前一天正常工作。
猜你喜欢
  • 2011-10-21
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2012-02-26
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多