我有一张包含不同代码的表格。他们的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的总和。
答案 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。)