gpt4 book ai didi

c - 为什么按位除法不像按位乘法那样工作?

转载 作者:行者123 更新时间:2023-12-02 02:21:15 26 4
gpt4 key购买 nike

假设我想仅使用按位移位来计算 20*10=200。这可以轻松完成

a = 20<<3 // 2^3
b = 20<<1 // 2^1
a + b // Result is 200.

现在,为什么如果我尝试对除法做同样的事情,我会得到错误的结果?例如,如果我尝试计算 200/10

#include <stdio.h>

int main() {

int value = 200;
int a = value >> 3;
int b = value >> 1;

printf("200/10 is %d\n", (a+b));

return 0;
}

我得到了125?我做错了什么?

最佳答案

这里的评论很好地解释了为什么这不起作用。下面详细阐述了为什么乘法技术有效而除法技术无效。

让我们从乘法开始。假设您要计算 200 × 10。您可以通过计算 200 × (9 + 1) 或 200 × (8 + 2) 等来计算。这些表达式中的每一个都与原始表达式等效。使用分配律,这意味着我们可以计算 200 × 9 + 200 × 1 得到 200 × 10,或者我们可以计算 200 × 8 + 200 × 2 得到 200 × 10,等等。

碰巧的是,通过位移位可以更容易地完成乘以 2 的幂。因此,例如,我们可以通过评估来计算 200 × 10

200 x 10 = 200 x (8 + 2)
= 200 x 8 + 200 x 2
= (200 << 3) + (200 << 1)

现在,我们可以这样进行除法吗?嗯,确实是 200/10 = 200/(8 + 2),和以前一样。但与乘法不同的是,在 200/(8 + 2) 的情况下,我们没有分配律,因此我们无法重写

200 / (8 + 2) = (200 / 8) + (200 / 2).

因此,我们不能使用移位技术的逆来快速进行除法。

关于c - 为什么按位除法不像按位乘法那样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66389942/

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