仅使用位操作将两个数相乘

时间:2013-07-09 08:30:55

标签: c bit-manipulation

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

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

3 个答案:

答案 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);
}

一旦你像这样展开它,就应该清楚表达式是做什么的。