如何转换位到位的移位值



我将难度选择器设置为enum (None=0, Easy = 1<<0, Medium = 1<<1, Hard = 1<<2, Expert = 1<<3)。与此同时,我有一个数组的点值,我想分配给这些困难。数组的下标是这样的。[0,100,133,166,200].

棘手的是这个。我想要获取数组的下标,这相当于难度的位移。所以None = 0 (0000)->指数= 0。Easy = 1 (0001)->索引= 1。中= 2 (0010)->指数= 2。硬= 4 (0100)->指数= 3。Expert = 8 (1000) ->4.

我最初试着做平方根,因为我认为它是2的幂,但很快意识到它实际上不是取2,它只是以2为底。所以这是行不通的。

我也知道我可以通过forloop获得这个值,例如,我从8(1000)开始,并在右移时保持计数器,直到它达到0。

int difficulty = (int)LevelSetup.difficulty;
int difficultyIndex = 0;
while(difficulty != 0)
{
difficultyIndex++;
difficulty = difficulty >> 1;
}
currScorePerQuestion = ScorePerQuestion[difficultyIndex];

IE。计数器= 0;Val = 8。| SHIFT | Counter = 1;Val = 4;|SHIFT| Counter = 2;Val = 2;|SHIFT| Counter = 3;Val = 1;|SHIFT| Counter = 4;Val = 0;|END|以值4结束

这样做的问题是,它看起来非常混乱和过度,特别是当你想要达到64位并有很多索引时。我只知道有一种算法可以用来很简单地转换它们。我只是在努力想出那个方程到底是什么。

任何帮助是超级感激,谢谢!

问了朋友之后。他们想出并给了我这个解决方案。

因为二进制是2的n次方。我们总是以2为底,取位数。所以2^4等于8,也就是二进制的1000。

然后,利用对数的性质。你可以用以2为底的对数,它符合以2为底的幂,然后取它的值的对数得到指数。即Log2(2^3) = 3。Log2(2^7) = 7

对我们来说幸运的是,二进制完全匹配这个模式,所以(1000)的位掩码是8,等于2^3,所以Log2(8) =>3 .

要将位转换为索引,例如(1000)是第4位,因此我们需要索引为4。Log以2为底8的对数->Math.Log2(8) = 3。然后为了得到基于0的索引,我们只需要加1。

这就留给我们如下的算法:
int difficulty = (int)LevelSetup.difficulty;
currScorePerQuestion = ScorePerQuestion[Math.Log2(difficulty)+1];

最新更新