Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
C 位操作-理解将负数乘以分数时向零偏差舍入_C_Binary_Bit Manipulation_Binary Operators - Fatal编程技术网

C 位操作-理解将负数乘以分数时向零偏差舍入

C 位操作-理解将负数乘以分数时向零偏差舍入,c,binary,bit-manipulation,binary-operators,C,Binary,Bit Manipulation,Binary Operators,我有一个位处理方法,它将一个数字乘以八分之五,如果有余数,则向0取整。这种方法很有效,我几乎完全理解。然而,当我回顾它时,我意识到我不确定anding 7 00000111如何解释舍入误差,在舍入误差中,它将舍入一个更负的数字,而不是0,我需要理解为什么这一行有效。就我所见,将乘法5个31位右移只会检查变量的符号,如果是负数,则得到所有的1,因此,如果是正数,则与7相加将得到所有的零,如果是负数,则在二进制中得到y。如果我的理解是正确的,为什么把它加上五分之八,再除以8,就可以把一个负数舍入,而

我有一个位处理方法,它将一个数字乘以八分之五,如果有余数,则向0取整。这种方法很有效,我几乎完全理解。然而,当我回顾它时,我意识到我不确定anding 7 00000111如何解释舍入误差,在舍入误差中,它将舍入一个更负的数字,而不是0,我需要理解为什么这一行有效。就我所见,将乘法5个31位右移只会检查变量的符号,如果是负数,则得到所有的1,因此,如果是正数,则与7相加将得到所有的零,如果是负数,则在二进制中得到y。如果我的理解是正确的,为什么把它加上五分之八,再除以8,就可以把一个负数舍入,而不会出错呢

int multFiveEights(int x) {
将其分解为乘以5,然后除以8 将其向左移动2将其乘以4,再加上x将其乘以5

int multiplyByFive = (x << 2) + x;
11111111如果在负数时右移31,则得到所有1

如果为正,则返回所有0;如果为负,则返回LSB中的1

将7添加到多个5个错误帐户

如果它是负数,它将尝试向下取整,取更负数,因此将其与7进行anding可解释此错误/测试余数

int fiveEigths = (multiplyByFive + addNumber) >> 3;
return fiveEigths;
乘以5+0>>3除以8始终向下舍入,并且 乘以5+7>>3除以8,总是向上取整

通过检查零在哪个方向,然后在那个方向取整,代码总是向零取整。如果要除的数字是负数,那么它加上7,所以它向上取整,接近零。如果它是正的,那么它加上0,所以它向下舍入,这也是向零的方向。

乘以5+0>>3除以8总是向下舍入,并且 乘以5+7>>3除以8,总是向上取整

通过检查零在哪个方向,然后在那个方向取整,代码总是向零取整。如果要除的数字是负数,那么它加上7,所以它向上取整,接近零。如果它是正的,那么它加上0,所以它向下取整,也就是向零的方向取整。

当乘法为负时,addNumber将是7,当它是正的时候,addNumber将是0,我想你理解这部分

所以,逻辑是在右移3之前,将7与乘法5相加,但只有当它为负数时

为了理解这是为什么,请考虑下3位的舍入和舍入的区别。

当低3位为零时,向上舍入和向下舍入将不会产生任何差异,因为不需要进行舍入,因为数字是8的倍数,因此除以8(右移3的结果)将产生整数结果

如果较低的3位是其他位,则向下舍入的最终结果将比向上舍入的结果少一位

通过添加7,您将通过在每种情况下的第4位上计时,将最终结果增加1,但较低的3位为零时除外。如果它们都是0,则加7将把低3位设置为1,但不会影响第4位,使移位结果保持不变。

当乘法为负时,addNumber将为7,当乘法为正时,addNumber将为0。我假设您理解这一部分

所以,逻辑是在右移3之前,将7与乘法5相加,但只有当它为负数时

为了理解这是为什么,请考虑下3位的舍入和舍入的区别。

当低3位为零时,向上舍入和向下舍入将不会产生任何差异,因为不需要进行舍入,因为数字是8的倍数,因此除以8(右移3的结果)将产生整数结果

如果较低的3位是其他位,则向下舍入的最终结果将比向上舍入的结果少一位

通过添加7,您将通过在每种情况下的第4位上计时,将最终结果增加1,但较低的3位为零时除外。如果它们都是0,则加7将把较低的3位设置为1,但不会影响第4位,使移位结果保持不变。

如果x为正,那么您是否理解为什么x/8向下舍入而x+7/8向上舍入?如果x为正,那么您是否理解为什么x/8向下舍入而x+7/8向上舍入?
int fiveEigths = (multiplyByFive + addNumber) >> 3;
return fiveEigths;