获得给定数字+ c的2的幂的总和

时间:2011-07-19 21:02:44

标签: c# algorithm

我有一张包含不同代码的表格。他们的Id是2的幂。(2 0 ,2 1 ,2 2 ,2 3 .. )。 根据不同的条件,我的应用程序将为“Status”变量赋值。  例如:

状态= 272(2 8 + 2 4
          状态= 21(其中2 4 + 2 2 +2 0

如果Status = 21,那么我的方法(C#)应该告诉我21是16 + 4 + 1的总和。

5 个答案:

答案 0 :(得分:16)

如果选中它们,您可以测试输入值中的所有位:

int value = 21;

for (int i = 0; i < 32; i++)
{
    int mask = 1 << i;
    if ((value & mask) != 0)
    {
        Console.WriteLine(mask);
    }
}

输出:

1
4
16

答案 1 :(得分:14)

for (uint currentPow = 1; currentPow != 0; currentPow <<= 1)
{
   if ((currentPow & QStatus) != 0)
      Console.WriteLine(currentPow); //or save or print some other way
}

对于QStatus == 21,它会给出

1 
4
16

说明: 的 2的幂在其二进制表示中只有一个1。我们将那一个作为最右边的一个(最不重要)并迭代地向左推(朝向更重要),直到数字溢出并变为0。每次我们检查currentPow & QStatus不是0。

答案 2 :(得分:4)

对于设置了[Flags]属性的枚举,这可能会更加清晰。

答案 3 :(得分:2)

这基本上是二进制的(因为二进制也是基数2)。你可以改变位值!

uint i = 87;

uint mask;
for (short j = 0; j < sizeof(uint); j++)
{
    mask = 1 << j;
    if (i & mask == 1)
        // 2^j is a factor
}

答案 4 :(得分:2)

您可以使用按位运算符(假设您的代码足够少,值保留在整数变量中)。

取消设置最后一个设置位后,

a & (a - 1)会返回a。您可以使用它来获取相应标志的值,例如:

while (QStatus) {
  uint nxtStatus = QStatus & (QStatus - 1);

  processFlag(QStatus ^ nxtStatus);

  QStatus = nxtStatus;
  }

processFlag将按照递增顺序设置值进行调用(例如,如果QStatus最初为21,则为1,4,16。)