在c中学习Bit操作时,我正在搜索只使用位操作将两个数相乘的代码,我找到了以下代码!我无法理解三元运算符在以下场景中的工作原理并产生正确的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;
}
有人可以解释上面的代码是如何工作的吗?。
答案 0 :(得分:2)
不使用“仅位操作”,因为它使用+
来添加数字。
也许缩进可以帮助打破复杂的表达:
return (y == 0 ? 0
: (y & 1) == 1 ? x
: 0)
+ multiply(x << 1, y >> 1);
基本上它是一个递归加法,在y
达到0时停止。如果设置了y
的最低有效位,则x
被添加到结果中,否则不是。y
。在每次递归时,丢弃一位x
,使其最终达到0. x = 3
的值向左移动,非常类似于手动乘法。
例如,如果11
(二进制y = 6
)和110
(二进制0 * 3 + 1 * 6 + 1 * 12 = 18
),它将计算
a * b
当然18是3 * 6.
每个递归步骤都写为a
,其中y
是该步骤y
的最低有效位(从左边读,你得到0,1,1这是从最低有效位开始的b
位和x
是该步骤中{{1}}的值。
答案 1 :(得分:2)
如果y是奇数,x * y = x + (x * 2) * (y / 2)
如果y是偶数,x * y = (x * 2) * (y / 2)
使用上面的逻辑,并使用递归直到y = 0
。
答案 2 :(得分:1)
如果您正在努力理解条件运算符的复杂嵌套使用,那么只需将其扩展为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);
}
一旦你像这样展开它,就应该清楚表达式是做什么的。