我有以下代码将一组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;
}
答案 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;
}