繁体   English   中英

获取给定数字的 2 的幂和 + c#

[英]Get the sum of powers of 2 for a given number + c#

我有一张不同代码的表格。 他们的 ID 是 2 的幂。(2 0 , 2 1 , 2 2 , 2 3 ...)。 根据不同的条件,我的应用程序将为“状态”变量分配一个值。 例如:

状态 = 272(即 2 8 + 2 4
状态 = 21(即 2 4 + 2 2 +2 0

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

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

int value = 21;

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

Output:

1
4
16
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。

使用带有[Flags]属性集的枚举,这可能会做得更干净。

这基本上是二进制的(因为二进制也是基数 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
}

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

a & (a - 1)在取消设置最后一个设置位后返回a 您可以使用它来获取相应标志的值,例如:

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

  processFlag(QStatus ^ nxtStatus);

  QStatus = nxtStatus;
  }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM