2016-12-04 68 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的原始代码没有区别。 –