我有以下代码,它将一组 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 00001110
对于 a
,1 <<0 = 1,所以取这些位和 AND 它
00000000 00000001
a 的结果为 0,因此布尔值应为假。
对于 b
,1 <<1 = 2,所以取 r
的位和 AND 它
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;
}