在32位整数上查找偏移量

时间:2015-10-09 14:47:49

标签: c

我有一个非常简单的问题,但我无法解决它。 有一个从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

有谁可以给​​我方程式?

2 个答案:

答案 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)上,这可能比三元方法更快。

我将离开,找出为什么这是一个小的家庭作业任务是正确的。请注意:布尔表达式保证会产生01