![]() |
1
15
(警告未来的读者):维基百科的代码产生次优ASM(GCC包括分支或CMOV)。见 Best practices for circular shift (rotate) operations in C++ 为了有效的UB自由旋转。 从 Wikipedia :
|
![]() |
2
3
这个答案是我发布内容的副本 Best-practices for compiler-friendly rotates . 见 my answer on another question 详细信息。 在C语言中表示旋转(避免任何未定义的行为)的编译器最友好的方法似乎是 John Regehr 的实现:
适用于任何整数类型,而不仅仅是
我建议不要在操作数类型上进行模板化,因为当您在
确保使用无符号类型
|
![]() |
3
1
虽然线程是旧的,但我想在讨论中加上我的两分钱,并提出我的问题解决方案。希望它值得一看,但如果我错了,请纠正我。 当我在寻找高效和安全的旋转方式时,我很惊讶没有真正的解决方案。我在这里找到了一些相关的线索: https://blog.regehr.org/archives/1063 (安全、高效、可移植的C/C++) Best practices for circular shift (rotate) operations in C++ 维基百科风格(包括分支,但安全):
经过一点思考,我发现模除符合标准,因为结果提示总是低于除数,这完全符合移位<32的条件,没有分支。 从数学的角度来看:
在我们的例子中,每(x%32)<32,这正是我们想要实现的。(是的,我根据经验进行了检查,结果总是32分)
此外,mod()将简化该过程,因为的实际旋转,假设100位旋转了32位3次,基本上不改变任何内容,然后是4位。那么,计算100%32==4并旋转4位不是更好吗?无论如何,它需要单处理器操作,并将其转换为常量值加上一条指令,Ok2作为参数必须从堆栈中获取,但是它仍然比像“wikipedia”那样使用if()进行分支要好。 你们觉得怎么样? |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |