|
|
1
327
围捕…
或(避免X+Y溢出)
|
|
|
2
59
对于正数:
|
|
|
3
56
Sparky的答案是解决这个问题的一种标准方法,但是正如我在我的评论中所写的,你会冒溢出的风险。这可以通过使用更宽的类型来解决,但是如果你想划分
NathanErnst的答案提供了一个解决方案,但它涉及函数调用、变量声明和条件,这使得它不短于ops代码,甚至可能更慢,因为它更难优化。 我的解决方案是:
它将比ops代码快一点,因为模块和除法是使用处理器上的相同指令执行的,因为编译器可以看到它们是等效的。至少GCC4.4.1在x86上使用-o2标志执行此优化。 理论上,编译器可能会在NathanErnst的代码中内联函数调用并发出相同的东西,但当我测试它时,gcc没有这样做。这可能是因为它将编译后的代码绑定到标准库的单个版本。 最后一点要注意的是,在现代机器上,这些都不重要,除非您处于一个非常紧密的循环中,并且所有数据都在寄存器或一级缓存中。否则,所有这些解决方案都将同样快速,除了可能是Nathan Ernst的解决方案,如果必须从主内存中提取函数,那么这个解决方案可能会慢得多。 |
|
|
4
16
你可以使用
|
|
5
12
这个怎么样?(要求Y非负,因此在Y为无非负性保证的变量的情况下,不要使用此选项)
我减少了
我避免
签字
在现代通用CPU上,这可能不是一个巨大的好处,但在嵌入式系统中,这比任何其他正确答案都要快得多。 |
|
|
6
5
有正负两种解决方案
注意,如果
如果
|
|
|
7
3
这适用于正数或负数。
如果有余数,检查x和y是否相同,并相应地加1。 |
|
|
8
2
简化的通用形式,
对于更一般的答案, C++ functions for integer division with well defined rounding strategy |
|
|
9
0
我宁愿发表评论,但我没有足够高的代表。 据我所知,对于+ve&pow的2,这是最快的方法(在CUDA中测试)
否则(也只是+ve),我倾向于这样做:
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |