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



我有以下代码,它将一组 9 个布尔值转换为我的 int,我将其用于瓦片地图精灵数组以快速找到图块。只是好奇,有没有一种简单的方法来扭转这种情况?

即,如果所有布尔值都为真,则下面的结果将是 511。有没有一种简单的方法可以将其转换回来以分配布尔值全部为真?或者另一个例子,a 是假的,其余的都是真的,结果将是 510。我怎样才能把它转换回 a = 真,其余的假?

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;
}

你想使用逻辑 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 <<0 = 1,所以取这些位和 AND 它

00000000 00000000

00000000 00000001

a 的结果为 0,因此布尔值应为假。

对于 b ,1 <<1 = 2,所以取 r 的位和 AND 它

00000000 00000000

00000000 00000010

你看到有 1 位是共同的,所以 AND 的结果是 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();
}

反其道而行之。

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

最新更新