【发布时间】:2015-03-06 23:15:20
【问题描述】:
我正在寻找等效于(num%2) == 0 || (num%3) == 0 的逐位测试。
我可以用num&1 替换num%2,但我仍然坚持使用num%3 和逻辑或。
这个表达式也等同于(num%2)*(num%3) == 0,但我不确定它有什么帮助。
【问题讨论】:
-
我认为:对于 3,代码可以检查 &0x03, &0x06, &0x09, &0x0C, &0x0F 应该捕获所有可以被 3 整除的值
-
@user3629249 0x12 呢?
-
请注意,具有常数除数的模运算可以非常有效地实现,并且常用的编译器已经包含了这些有效的方法。如果
num是无符号整数类型,生成的代码可能会快一点。您可能希望检查二进制可执行文件的反汇编(例如通过objdump)以确认。如果速度是目标,您可能还想考虑使用逻辑或|而不是布尔或||。 -
@njuffa:是的,我现在看到了
((num%2)|(num%3)) == 0选项。好主意,谢谢(介意我将其编辑到问题中吗?)。至于另一个建议,我可以在调试代码时直接查看反汇编,但我正在寻找能够不管底层架构(编译器+硬件)工作的东西。当然,一些 DSP 可能会在硬件级别上支持这一点(因此,与它们一起提供的编译器也会支持),但它是一个依赖于平台的解决方案。我正在寻找一个不可知的(跨平台)解决方案。 -
@njuffa 大多数编译器使用古老的“除以常数”技巧,然后乘回并比较数字是否与以前相同。它肯定比使用实际除法要快,但我从未见过编译器正确地做到这一点。我已经在 GCC、Clang 和 ICC 上尝试过。
标签: java python c++ c bit-manipulation