2016-12-04 5 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; 
} 

편집이다 : - 버그 라인 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

당신은 변화 (< 2 NUM <) 후 납입을 추가에, 납입에 대한 임시 값을 설정합니다. <<+ 사이

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

'num << 2'는 그렇지 않습니다. 'num'의 값을 변경하십시오. – giusti

+1

이것은 OP의 원래 코드와 다르게 작동합니다. –