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时执行欧几里德分割。因为我不习惯使用〜运算符。请帮助我调整我的方法。
答案 0 :(得分:6)
~n
是-n - 1
。
所以~(~n / d)
是-((-n - 1) / d) - 1
。
对于n
的负值和d
的正值,结果是向下舍入的除法(除法通常向零舍入,因此向上舍入为n
的负值) 。我无法解释为什么会这样。