gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:57 25 4
gpt4 key购买 nike

我有一个位操作方法,可以将一个数乘以八分之五,如果有余数则向 0 舍入。该方法有效,而且我几乎了解所有内容。然而,当我审查它时,我意识到我不确定 anding 7 (00000111) 是如何解释舍入误差的,在舍入误差中它会舍入到一个更负的数而不是 0,我需要理解为什么这条线有效。据我所知,将 multiplyByFive 向右移动 31 位只会检查变量的符号,如果为负则产生所有 1,因此如果为正则将其与 7 相加将产生全零,如果为负则产生二进制 y。如果我的理解是正确的,为什么将其与 multiplyFiveEighths 相加并将总和除以 8 会将负数向下舍入,而不会出现错误。

int multFiveEights(int x) {

分解为乘以 5 再除以 8将它向左移动 2 乘以 4,加上 x 使它乘以 5

int multiplyByFive = (x << 2) + x;

如果结果为负,且右移前2^3 - 1 = 7

int addNumber = 7 & (multiplyByFive >> 31); 

11111111(如果您在负数时右移 31,则全为 1)

如果为正则返回全 0,如果为负则在 LSB 中返回 1

将 7 加到 multiplyByFive 中以解决错误

如果它是负数,它会尝试向下舍入到更负数,所以用 7 来解释这个错误/测试余数

int fiveEigths = (multiplyByFive + addNumber) >> 3;
return fiveEigths;

最佳答案

addNumber 将在 multiplyByFive 为负时为 7,在为正时为 0(我假设您理解这部分内容)。

因此,逻辑是在右移 3 之前将 7 加到 multiplyByFive,但前提是它为负数。

要理解这样做的原因,请考虑在低 3 位方面向下舍入和向上舍入之间的区别。

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

当低 3 位为其他值时,向下舍入的最终结果将比向上舍入时少 1。

通过加 7,最终结果将增加 1,除低 3 位为 0 外,在每种情况下都对第 4 位进行计时。如果全为0,加7会将低3位置1,但不影响第4位,移位后的结果不变。

关于c - 位操作 - 理解将负数乘以分数时向零偏差舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42127446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com