gpt4 book ai didi

c - 不带 * 的整数乘法

转载 作者:行者123 更新时间:2023-11-30 18:26:41 25 4
gpt4 key购买 nike

我在其中一个网站上看到一个 C 语言面试问题,要求你编写一个函数,获取 2 个整数、num 和 times,并在不使用 * 运算符的情况下将它们相乘,这意味着主要使用左移和右移。我想出了一个可行的答案(除非有人发现错误),但是有人有更好的方法在更好的时间或内存消耗中解决它吗?

这是我写的:

#include <stdio.h>

int multiply_with_shift (int num, int times)
{
int cnt=0;
int org_times=times;
if((num & times)==0)
return 0;
else
{
while(times >1)
{
times= times >> 1;
cnt++;
}
int val= 1;
val= val <<cnt;
int sub= org_times-val;
int res= num << cnt;
for( int i=0 ; i < sub; i++)
{
res+=num;
}
return res;
}
}


void main()
{
int tmp;
tmp=multiply_with_shift(5,15);
printf(" the answer is : %d \n", tmp);
printf("\n");
}

最佳答案

这是一个更简洁且无错误(我相信)的实现,它甚至不会调用未定义的行为:

unsigned mul(unsigned a, unsigned b)
{
unsigned acc = 0;
while (b) {
if (b & 1) acc += a;
b >>= 1;
a <<= 1;
}
return acc;
}

您的代码有几个缺陷:

  1. 可读性、长度等...
  2. if ((num & times) == 0) return 0; -> 对于在二进制表示中不共享至少一个 2 的公共(public)幂的数字,这将返回 0,我。 e. 4 * 8 = 0
  3. 符号位移位是 C 中未定义的行为 - 您需要使用无符号整数来完成此任务。

关于c - 不带 * 的整数乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855476/

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