C 查找32位整数上的偏移量
我有一个非常简单的问题,但我不能解决它。 有一个从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=>3C 查找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
谁能给我一个公式吗?假设
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