【发布时间】:2018-01-06 20:27:58
【问题描述】:
我需要在没有分支或布尔表达式的情况下实现以下功能:
uint8_t func(uint32_t num, uint8_t shl)
{
if (num >= (1 << shl))
{
return shl;
}
else
{
return 0;
}
}
我做的第一步是注意到else 部分很简单:
return num / (1 << shl);
当然,在if 部分执行此操作不一定会产生预期的结果。
所以我想我需要一些比num / (1 << shl) 更“聪明”的东西。
如果我能想出一个可以给我1 或0 的表达式,那么我就完成了。
是否有某种方法可以仅使用算术/按位运算(即,没有分支或布尔表达式)?
谢谢。
【问题讨论】:
-
@lurker:没有家庭作业(这又有什么关系呢??????)。我需要避免分支以优化性能。我实际上是从循环内部调用此代码,而不是在函数中(此处描述是为了简化问题并专注于问题)。
-
@goodvibration 你用的是什么编译器?生成的 asm 是什么样子的?
-
根据备选方案,分支可能不是最理想的。为什么不问问实现该功能的最佳方式是什么?答案可能还取决于平台和编译器。
-
@goodvibration 这不是这个网站的运作方式。问题应尽可能清晰准确,以便未来的读者易于回答和搜索。
-
过早的优化是邪恶的。在尝试手动优化之前,您必须证明代码中存在性能问题。然后,请修复您的
?密钥。
标签: c bit-manipulation integer-arithmetic