2015-02-03 2 views
0

나는 다음과 같은 비트 연산 문을 볼 수 있지만, 실행의 순서 것입니다 : 이것은 agemap (등록됨 0x111)에서 나이를 (값 2)를 제거하는 데 사용하지만 기반으로다음 비트 연산의 실행 순서는 무엇입니까?

// Example program 
#include <iostream> 
#include <string> 
#include <stdio.h> 

int main() 
{ 
    unsigned int age = 2; 
    unsigned int agemap = 0x111 ; 
    if(age > 0 && age <= 32) 
    { 

     agemap &= (unsigned int)~((unsigned int)1 << (unsigned int)(age - 1)); 
    } 
} 

어떤 순서를 실행됩니까?

+0

당신의 값이 = = 등록됨 0x111 진 000100010001이 문제가 보인다 에프 또는 공통 비트 연산. – Marichyasana

+0

왜? – ratzily

답변

1

다른 식과 마찬가지로 C 연산자의 우선 순위에 따라 "기반"합니다. 당연히 괄호가 많으므로이를 고려해야합니다.

Wikipedia에는 좋은 테이블이 있습니다. C에는 꽤 많은 연산자가 있기 때문에 복잡합니다.

기본적으로 오른쪽은 ~(1 << 1)으로 계산되며, 이는 ~2입니다.이 값은 32 비트 unsigned int이라고 가정하고 0xfffffffd입니다. 당신이 제거하면

1
agemap &= (unsigned int)~((unsigned int)1 << (unsigned int)(age - 1)); 

(unnecesary는) 캐스트 : agemap의

agemap &= ~(1U << (age - 1)); 
  1. age - 1
  2. 1U << 1
  3. ~2
+0

을 설명 할 수 있고'~ 2'를'0x111'로'''''''''0x111'을 변경하지 않으면 안됩니다. 어느 것이 나를 묻는가?이 코드는 OP가 생각하는대로하고 있습니까? – AAT

관련 문제