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