【发布时间】:2017-02-03 03:31:15
【问题描述】:
我正在研究一种仅使用二元运算符(> + ^ ~ & | !)将有符号整数除以 2 的幂的方法,结果必须向 0 舍入。我遇到了this question 也在 Stackoverflow 关于这个问题,但是,我不明白它为什么会起作用。这是解决方案:
int divideByPowerOf2(int x, int n)
{
return (x + ((x >> 31) & ((1 << n) + ~0))) >> n;
}
我了解x >> 31 部分(仅在x 为负数时添加下一部分,因为如果为正数,x 将自动向0 舍入)。但困扰我的是(1 << n) + ~0 部分。它是如何工作的?
【问题讨论】:
-
二进制补码。但你是对的,答案没有解释任何事情。现在,当您这样做时,您会遭到反对...
-
x + ~0是写x - 1的一种有趣方式,它只是将舍入掩码截断为n位 -
1) 担心除以负数? 2) 担心可移植地除负数? 3) 担心处理
x == INT_MIN? 4) 满足/超过int位宽的 2 的幂呢?否则,目标太窄了,超出了对int的可能性或范围和细节的狭隘想法,它就没有多大用处。
标签: c binary bit-manipulation