2013-07-21 4 views

답변

15

발현 set >>= 1;1 (오른쪽 시프트 연산자 체크 비트 Bitwise Shift Operators>> 자기 할당 형태)로 set의 우측 시프트 비트하다 set = set >> 1; 의미한다. set 경우

가한다고 가정된다

BIT NUMBER 31 n=27  m=17     0 
       ▼ ▼   ▼     ▼ 
set =   0000 1111 1111 1110 0000 0000 0000 0000 

이어서 set 변수 set >> = 1; 후 :

BIT NUMBER 31 n=26  m=16     0 
       ▼  ▼   ▼     ▼ 
set =   0000 0111 1111 1111 0000 0000 0000 0000 

통지 비트의 개수는 시프트.

참고 흥미로운 점 : setunsigned long 때문에 그래서이 >> 작업이 logical shift (unsigned shift)를해야 논리적 변화는 숫자의 부호 비트를 보존하지 않습니다.

또한 모든 비트를 오른쪽 (하위 유효 숫자로)으로 이동하기 때문에 하나의 오른쪽 시프트는 = 2로 나누기입니다.

check this code (단지 마지막 점을 증명하기 위해) :

int main(){ 
unsigned long set = 268304384UL; 
set >>= 1; 
printf(" set :%lu \n", set); 
set = 268304384UL; 
set /= 2; 
printf(" set :%lu \n", set); 
return 1; 
} 

그리고 출력 :

set :134152192 
set :134152192 

(참고 : 자사하지 >>을 의미 않고 / 모두 동일) 유사

왼쪽 시프트의 경우 <<= 연산자를 사용할 수 있음을 확인하십시오. Bitwise operatorsCompound assignment operators, 섹션 : bit expressionssigned/arithmetic shift and unsigned shift의 차이점을 확인하십시오.

+0

고맙습니다. – Rotom92

+0

@ Rotom92 환영합니다 Rotom :) –

6

이 "오른쪽 시프트"는 값을 1 비트 씩 증가시킵니다. 정수의 모든 비트를 1만큼 오른쪽으로 이동하면 2 진수가 2 진수 시스템이기 때문에 효과적으로 "2로 나눕니다".

하면 이진 숫자 12을 상상해 :

1100 = 12 in binary 
110 = 6 in binary (1100 right-shifted) 

그냥 같은 당신은 바로 하나는 10

3

모든 이항 연산자는 =과 결합 할 수 있습니다.모든 경우

dest op= expression 

dest = dest op expression 

동등 (dest 어떤 부작용이있는 경우를 제외하고, 그들은 단지 한번 일어난다).

그래서이

set>>=1; 

이 동등하다는 것을 의미 : >> 이후

set = set >> 1; 

이진 오른쪽 시프트 연산자이고, 그 오른쪽으로 1 비트 씩 set의 값을 전환하는 것을 의미한다.

관련 문제