簡體   English   中英

僅使用位運算將兩個數字相乘

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM