2012-05-22 3 views
0

int에서 단일 비트를 가져 오기로되어있는 코드의 일부를 찾고 있습니다.
은 다음과 같다 :왜 그런 단일 비트를 얻습니까?

private int getBit(int token, int pos){ 
    return (token & (1 << pos)) != 0 ? 1 : 0; 
} 

내 질문은 왜 그것을 다음 (단순) 방식으로하지 않습니다 무엇입니까?

return token & (1 << pos); 

나는 그것도 0 또는 1를 반환 할 것으로 예상.
내가 잘못 생각하나요? 두 번째 (내 버전) 버전이 잘못 되었습니까?

+0

의 순서에 뭔가를 사용할 수 있습니다. –

답변

2

버전이 잘못되었습니다. 이 제로가 아닌 경우

return token & (1 << pos); 

을 실행하면 pos 비트가 제로로 제외 즉 & 연산자의 오른쪽에있는 숫자이기 때문에, 당신은, 모든 비트와 int를 얻을. pos==0 인 경우 분명히 1이됩니다.

& 연산자는 두 개의 int에서 해당 비트 사이의 비트와 연산을 간단히 취하기 때문에 발생합니다. 1 << pos은 가장 낮은 위치 이외의 위치에 1 비트가 있고 token은 아마 int 일 수 있기 때문에 결과는 가장 낮은 위치가 아닌 다른 위치에 1 비트가있어 1보다 커집니다. 물론

+0

브랜치를 피할 수있는 다른 방법이 있는데,'return (token >>> pos) & 1'입니다. –

+0

사실입니다. 기존 코드의 변경을 줄이려면'(token & (1 << pos)) && 1'을 할 수 있습니다. 나는 그것이 그 질문에 관한 것이 아니기 때문에 그 물건을 언급하지 않았다. – murgatroid99

2

귀하의 버전은 0 또는 1<<pos을 반환합니다.

부울 컨텍스트에서 사용되는지는 중요하지 않습니다. 그러나 그렇지 않을 수도 있습니다.

3

귀하의 버전은 pos 위치의 비트 값을 반환하지 않습니다. 값 0 또는 2^(pos-1)을 리턴합니다.

2

, 당신은 두 번째 버전이 비트가 '0, 그렇지 않으면'설정, 또는 경우에 '1 << pos`를 반환합니다

(token >> pos) & 1 
관련 문제