[英]multiply two numbers using only bit operations
在学习c中的位运算时,我正在寻找仅使用位运算将两个数相乘的代码,结果发现了以下代码! 我无法理解三元运算符在以下情况下如何工作并产生正确的o / p。
#include<stdio.h>
static int multiply (int x, int y)
{
return y==0?0:((y&1) ==1?x:0)+multiply(x<<1,y>>1);
}
int main()
{
printf("%d",multiply(2,3));
return 0;
}
有人可以解释上面的代码如何工作吗?
那不是使用“仅位操作”,因为它是使用+
加上数字。
缩进也许可以帮助分解复杂的表达式:
return (y == 0 ? 0
: (y & 1) == 1 ? x
: 0)
+ multiply(x << 1, y >> 1);
基本上,这是一个递归加法,在y
达到0时停止。如果设置了y
的最低有效位,则将x
添加到结果中,否则不进行添加。 在每个递归的一位y
被丢弃,这样最终会达到0的值x
被移到左侧,用手做乘法的时候很像。
例如,如果x = 3
(二进制11
)和y = 6
(二进制110
),它将计算
0 * 3 + 1 * 6 + 1 * 12 = 18
当然18是3 * 6
每个递归步骤都写为a * b
,其中a
是该步骤中y
的最低有效位(从左侧读取,您将得到0、1、1,这是y
的最低有效位开始的位), b
是在该步骤中x
的值。
如果y为奇数,则x * y = x + (x * 2) * (y / 2)
如果y为偶数,则x * y = (x * 2) * (y / 2)
使用上述逻辑,并使用递归直到y = 0
为止。
如果您在努力理解条件运算符的复杂嵌套使用,只需将其扩展为if语句:
static int multiply (int x, int y)
{
if (y==0)
return 0;
else
return ((y&1) ==1?x:0)+multiply(x<<1,y>>1);
}
然后展开内部条件运算符:
static int multiply (int x, int y)
{
if (y == 0)
return 0;
else if ((y&1) == 1)
return x + multiply(x<<1, y>>1);
else return
return multiply(x<<1, y>>1);
}
像这样展开后,应该清楚表达式在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.