java - 欧氏除法中的位补运算符

标签 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 < |b|,其中 |b|表示b的绝对值 - 定义欧氏除法

实现该逻辑的对应程序如下所示:

int ifloordiv(int n, int d){

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

看完上面的代码,我很明显地理解了 if(n>=0){} block 代码逻辑,我们正在做真正的除法而不是欧几里德。

但是,else{(n<0)} 使用位补码运算符 (~) 的代码逻辑在我看来并不明显,无法理解使用 ~ 运算符背后的思维方法。一般我们想到除法都会用到>>运算符。

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

我的问题是:

我想了解一下思考方法,我怎么能想到使用位补运算符(~)来帮助你在 n<0 时执行欧氏除法。因为考虑使用 ~ 运算符对我来说并不明显。请帮我调整我的方法。

最佳答案

~n-n - 1

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

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

关于java - 欧氏除法中的位补运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21931738/

相关文章:

java - 如何使用 Java 设置 JLabel 的颜色?

java - 数组中的重复项无效输入

c - 代码是如何执行的和gcc

java - Clojure:如何在 Java 类上进行大小写切换

AspectJ:如何选择给定类的子类的非注释方法的执行?

c++ - QT SQLite 不能在嵌入式设备上工作

c++ - OpenCV 预期的构造函数、析构函数或类型转换

c++ - 宏的实际参数太多?

python - C 到 Python 字谜

c - 引擎功能 : Calling MATLAB from a C application