将位掩码转换回9个布尔值

时间:2014-01-10 19:16:33

标签: c# boolean bitmask

我有以下代码将一组9个布尔值转换为一个int,我将其用于tilemap sprite数组以快速找到tile。只是好奇,是否有一种简单的方法可以扭转这种局面?

即。如果所有bool都是真的,那么下面的结果将是511.是否有一种简单的方法将其转换为指定布尔值全部为真?或者另一个例子,a为假,其余为真,结果为510.如何将其转换为a = true而其余为false?

int GetBitmask(bool a, bool b, bool c, bool d, bool e, bool f, bool g, bool h, bool i)
{
    int r = (a ? 1 << 0 : 0) | (b ? 1 << 1 : 0) | (c ? 1 << 2 : 0) |
            (d ? 1 << 3 : 0) | (e ? 1 << 4 : 0) | (f ? 1 << 5 : 0) |
            (g ? 1 << 6 : 0) | (h ? 1 << 7 : 0) | (i ? 1 << 8 : 0);
    return r;
}

3 个答案:

答案 0 :(得分:6)

您希望使用逻辑AND(&)来屏蔽您的答案,并改变您r的方式:

a = (r & (1 << 0)) != 0;
b = (r & (1 << 1)) != 0;
c = (r & (1 << 2)) != 0;
d = (r & (1 << 3)) != 0;
e = (r & (1 << 4)) != 0;
f = (r & (1 << 5)) != 0;
g = (r & (1 << 6)) != 0;
h = (r & (1 << 7)) != 0;
i = (r & (1 << 8)) != 0;

这是做什么的:

假设r = 14(即b,c和d为真)。然后r的位是

00000000 00000000 00000000 00001110

对于a,1&lt;&lt; 0 = 1,所以取这些位并用

和它

00000000 00000000 00000000 00000001

a的结果为0,因此bool应为false。

对于b,1&lt;&lt; 1 = 2,所以取r和AND

的位

00000000 00000000 00000000 00000010

你看到共有1位,所以AND的结果是2,所以这是真的。

答案 1 :(得分:2)

它可能不比你的方法快,但你可以使用一点Linq:

int GetBitmask(params bool[] bits)
{
    return bits.Select((b, i) => b ? 1 << i : 0).Aggregate((a, b) => a | b);
}

并将其转换回来:

bool[] GetBools(int mask)
{
    return Enumerable.Range(0, 9).Select(b => (mask & (1 << b)) != 0).ToArray();
}

答案 2 :(得分:0)

反过来说。

bool[] GetBooleans( int input )
{
    bool[] ret = new bool[9];
    while( int i = 0; i < 9; ++i )
        bool[i] = (input >> i) & 1;
    return ret;
}