c - 如何在 C 中计算 2⁶⁴/n?
问题描述
如何计算整数除法,2 64 /n?假设:
unsigned long
是 64 位的- 我们使用 64 位 CPU
- 1 < n < 2 64
如果我们这样做18446744073709551616ul / n
,我们会warning: integer constant is too large for its type
在编译时得到。这是因为我们无法在 64 位 CPU 中表示 2 64 。另一种方法如下:
#define IS_POWER_OF_TWO(x) ((x & (x - 1)) == 0)
unsigned long q = 18446744073709551615ul / n;
if (IS_POWER_OF_TWO(n))
return q + 1;
else
return q;
是否有更快(CPU 周期)或更清洁(编码)的实现?
解决方案
我将uint64_t
在此处使用(需要<stdint.h>
包含),以免您假设unsigned long
.
phuclv 的使用思路-n
很巧妙,但可以做得更简单。作为无符号 64 位整数,我们有 -n = 2 64 -n,然后 (-n)/n = 2 64 /n - 1,我们可以简单地加回 1。
uint64_t divide_two_to_the_64(uint64_t n) {
return (-n)/n + 1;
}
生成的代码正是您所期望的(通过godbolt在 x86-64 上的 gcc 8.3 ):
mov rax, rdi
xor edx, edx
neg rax
div rdi
add rax, 1
ret
推荐阅读
- reactjs - 无法运行 React-Native 入门页面中给出的 AwesomeProject
- java - 设备旋转的 ImageView 可见性问题
- html - 如何关闭盒子类动画
- php - 将数据传递到要发布到 MySQL 数据库的新页面时的未定义索引,但仅用于文件名输入,并且数据不发布到数据库
- php - 如何通过 JSON DECODE 检索括号中的数据
- javascript - Vanilla Javascript 显示选项卡并隐藏其他选项卡
- ios - 处理后构建未在测试飞行中显示?
- java - 如何调用嵌套在多个子节点中的 Firebase 中的数据?
- python - 不带阴影误差条线的阴影误差条标记
- java - Java,Android,关于内存的线程安全唯一操作