2

在学习 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;
}

有人可以解释一下上面的代码是如何工作的吗?

4

3 回答 3

2

如果 y 是奇数,x * y = x + (x * 2) * (y / 2)

如果 y 是偶数,x * y = (x * 2) * (y / 2)

使用上述逻辑,并使用递归 until y = 0

于 2013-07-09T08:45:40.033 回答
2

不是使用“仅位操作”,因为它+用于添加数字。

也许缩进可以帮助分解复杂的表达式:

return (y == 0 ? 0
               : (y & 1) == 1 ? x
                              : 0)
       + multiply(x << 1, y >> 1);

基本上它是一个递归加法,当y达到0时停止。如果设置了最低有效位,y则将x其添加到结果中,否则不是。在每次递归中,删除一位 ,y最终将达到 0。 的值x向左移动,与手动乘法非常相似。

例如,如果x = 3(binary 11) 和y = 6(binary 110),它将计算

0 * 3 + 1 * 6 + 1 * 12 = 18

当然 18 是 3 * 6。

每个递归步骤都写为该步骤的最低有效位在a * b哪里(从左侧读取,您会得到 0、1、1,这是从最低有效位开始的位)并且是该步骤的值。ayybx

于 2013-07-09T08:35:59.450 回答
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);
}

一旦你像这样扩展它,应该清楚表达式在做什么。

于 2013-07-09T08:35:50.307 回答