Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 欧氏除法中的位补算子_Java_C++_C_Bit Manipulation - Fatal编程技术网

Java 欧氏除法中的位补算子

Java 欧氏除法中的位补算子,java,c++,c,bit-manipulation,Java,C++,C,Bit Manipulation,没有回答这个问题 我了解到,给定两个整数a和b≠ 存在唯一的整数q和r,使得a=bq+r和0≤ r=0){}块代码逻辑,我们正在做的是实除法而不是欧几里得除法 但是,当我们想到除法时,还有{(n>运算符 我知道java~运算符是整数类型上的1的补码运算符 我的问题是: 我想了解关于的思考方法,当n~n是-n-1时,如何使用位补运算符(~)来帮助您执行欧几里德除法 所以~(n/d)就是-(-n-1)/d)-1 对于n的负值和d的正值,这就是向下舍入的除法(除法通常向零舍入,对于n的负值向上舍入)。

没有回答这个问题

我了解到,给定两个整数a和b≠ 存在唯一的整数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);
}
在阅读了上面的代码之后,我很明显地理解了如果(n>=0){}块代码逻辑,我们正在做的是实除法而不是欧几里得除法

但是,当我们想到除法时,还有{(n>运算符

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

我的问题是:


我想了解关于的思考方法,当n
~n
-n-1
时,如何使用位补运算符(~)来帮助您执行欧几里德除法

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


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

如果你将两个数字分开,其中一个是正的,一个是负的,我相信在C90中舍入的定义可能不好,它可能是向上舍入,也可能是向下舍入。我认为C99中修复了这种无意义的情况,因此使用现代C编译器处理这类事情可能是明智的。@Lundin除法的舍入是实现的ATION在C90中定义。基本上没有硬件平台做过与后来在C99中标准化的不同的事情。因此,C99中的规范显然向后不兼容,出于同样的原因,使用C90编译器是完全安全的:除法是实现定义的,C90编译器实现N不会用C++来定义它。我继续用ImibIS的数学关系来解释我的老线程。这是什么语言?你提到java,但是标签C和C++。