C 查找32位整数上的偏移量

C 查找32位整数上的偏移量,c,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 谁能给我一个公式吗?假设i是32位整数,这个表达式可以工作: (i > 0xffffff? 3: i > 0xffff? 2: i > 0xff? 1: 0) 实际上,最后一个三元?:运算符是不必要的,因此表达式可以简化为 (i &g

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


谁能给我一个公式吗?

假设
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))

假设
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))
uint32_t val,范围,掩码=(uint32_C(1)掩码)>16)|(val&mask))>0xFFU);
注:这不是“偏移量”,而是给出范围/(使用的八位字节数-1)

在比较/跳转比较昂贵的CPU上(例如x86),这可能比三元方法更快

我将把找出为什么这是正确的作为次要的家庭作业。只需注意:布尔表达式保证生成
0
1

uint32_t val,range,mask=(uint32_C(1)mask)>16)|(val&mask))>0xFFU);
注:这不是“偏移量”,而是给出范围/(使用的八位字节数-1)

在比较/跳转比较昂贵的CPU上(例如x86),这可能比三元方法更快


我将把找出为什么这是正确的作为次要的家庭作业。只需注意:布尔表达式保证生成
0
1

旁注:使用
^
指定“的幂”不是一个好主意。最好使用
pow(base,exp)
或(不太容易混淆)
**
。您实际想要完成什么?我怀疑这不是你真正需要的,而是你认为你需要的。旁注:使用
^
来指定“的力量”不是一个好主意。最好使用
pow(base,exp)
或(不太容易混淆)
**
。您实际想要完成什么?我怀疑这不是您真正需要的,而是您认为您需要的。为什么要将
mask
作为一个单独的变量?@owacoder:因为我太懒了,无法输入两次。编译器应该对此进行优化。您的示例不适用于
val=0x10000
。它返回
range==1
而不是
range==2
@owacoder:No:(简化):掩码是
0xFFFFU
,因此
0x10000>0xFFFF==1
。左移位(也可以使用“*2
)产生
2`。掩码不是
0xFFFFU
。这是
(2为什么要将
掩码
作为一个单独的变量?@owacoder:因为我懒得键入两次。编译器应该对此进行优化。您的示例不适用于
val=0x10000
。它返回
range==1
而不是
range==2
@owacoder:No:(简化):掩码是
0xFFFFU
,因此
0x10000>0xFFFF==1
。左移位(也可以使用“*2
)产生
2`。掩码不是
0xFFFFU
。它是
(2