欧几里德分部的位补码运算符

时间:2014-02-21 10:28:47

标签: java c++ c bit-manipulation

https://math.stackexchange.com/questions/679146/euclidean-divison-program

没有回答此问题。

我了解到,给定两个整数a和b,b≠0,存在唯一的整数q和r,使得a = bq + r和0≤r<1。 | b |,其中| b |表示b的绝对值 - 定义欧几里德分裂

实现此逻辑的相应程序如下所示:

int ifloordiv(int n, int d){

if (n >= 0)
    return n / d;
else
    return ~(~n / d);
}

在阅读完上面的代码之后,我很明白,如果(n> = 0){}阻止代码逻辑我们正在进行实际划分而不是欧几里德。

但是,使用位补码运算符(〜)的其他{(n <0)}代码逻辑对于理解使用〜运算符背后的思维方法并不明显。通常我们使用&gt;&gt;我们想到分裂时的算子。

我知道java~运算符是整数类型的1的补码运算符。

我的问题是:

我想理解思考方法,我怎么能想到使用位补码运算符(〜)它可以帮助你在n <0时执行欧几里德分割。因为我不习惯使用〜运算符。请帮助我调整我的方法。

1 个答案:

答案 0 :(得分:6)

~n-n - 1

所以~(~n / d)-((-n - 1) / d) - 1

对于n的负值和d的正值,结果是向下舍入的除法(除法通常向零舍入,因此向上舍入为n的负值) 。我无法解释为什么会这样。