我有一个非常简单的问题,但我无法解决它。 有一个从0到(2 ^ 32)-1的索引,我想用这个索引计算一个偏移量:
0到(2 ^ 8)-1 => 0
2 ^ 8到(2 ^ 16)-1 => 1
2 ^ 16到(2 ^ 24)-1 => 2
2 ^ 24到(2 ^ 32)-1 => 3
有谁可以给我方程式?
答案 0 :(得分:4)
假设i
是你的32位整数,这个表达式将起作用:
(i > 0xffffff? 3: i > 0xffff? 2: i > 0xff? 1: 0)
实际上,最后一个三元?:
运算符是不必要的,因此表达式可以简化为
(i > 0xffffff? 3: i > 0xffff? 2: i > 0xff)
或者您可以删除三元运算符并仅进行比较和添加:
((i > 0xffffff) + (i > 0xffff) + (i > 0xff))
答案 1 :(得分:0)
uint32_t val, range, mask = (UINT32_C(1) << 16) - 1;
range = ((val > mask) << 1) | (((val >> 16) | (val & mask)) > 0xFFU);
请注意,这不是“偏移”,而是给出范围/(使用的八位字节数 - 1)。
在比较/跳转很昂贵的CPU(例如x86)上,这可能比三元方法更快。
我将离开,找出为什么这是一个小的家庭作业任务是正确的。请注意:布尔表达式保证会产生0
或1
。