2016-12-04 67 views
3

我正在嘗試使用按位運算將整數乘以5。但是我的代碼中似乎存在一個我無法識別的錯誤。 這裏是我的代碼使用按位運算符將整數乘以5

#include <stdio.h> 

#define print_integer(exp) printf("%s : %d\n", #exp, (exp)) 

int multiply(int num) { 
    int ans; 
    ans = num << 2 + num; 
    return ans; 
} 

int main() { 
    int a = 1, b = 2, c = 3; 
    print_integer(multiply(a)); 
    print_integer(multiply(b)); 
    print_integer(multiply(c)); 
    return 0; 
} 

編輯: - bug是線ans = num << 2 + num;

+5

'ANS =(NUM << 2)+ NUM;'https://en.wikipedia.org/wiki/Operators_in_C_and_C% 2B%2B#Operator_precedence – wildplasser

+0

...因爲'+'優先於'<<'。看看https://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx –

+0

哦,謝謝,這工作。 –

回答

3

<<+之間的優先級計數器直觀。使用圓括號內,並-Wall編譯獲得有用的警告緊靠這種潛在的錯誤:

#include <stdio.h> 

#define print_integer(exp) printf("%s : %d\n", #exp, (exp)) 

int multiply(int num) { 
     return (num << 2) + num; 
} 

int main(void) { 
    int a = 1, b = 2, c = 3; 
    print_integer(multiply(a)); 
    print_integer(multiply(b)); 
    print_integer(multiply(c)); 
    return 0; 
} 
-1

你的變化(NUM < < 2)後加入NUM,設置NUM一個臨時值。

int tmp = num ; 
ans = num << 2 + tmp ; 
+2

「num << 2」不會改變'num'的值。 – giusti

+1

這與OP的原始代碼沒有區別。 –