unsigned long set;
/*set is after modified*/
set >>= 1;
커널 시스템 호출에서이 오류가 발견되었지만 이해가되지 않습니다. 어떻게 작동합니까?이 ">> ="연산자는 C에서 무엇을 의미합니까?
unsigned long set;
/*set is after modified*/
set >>= 1;
커널 시스템 호출에서이 오류가 발견되었지만 이해가되지 않습니다. 어떻게 작동합니까?이 ">> ="연산자는 C에서 무엇을 의미합니까?
발현 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
통지 비트의 개수는 시프트.
참고 흥미로운 점 : set
이 unsigned 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 operators 및 Compound assignment operators, 섹션 : bit expressions 및 signed/arithmetic shift and unsigned shift의 차이점을 확인하십시오.
이 "오른쪽 시프트"는 값을 1 비트 씩 증가시킵니다. 정수의 모든 비트를 1만큼 오른쪽으로 이동하면 2 진수가 2 진수 시스템이기 때문에 효과적으로 "2로 나눕니다".
하면 이진 숫자 12을 상상해 :
1100 = 12 in binary
110 = 6 in binary (1100 right-shifted)
그냥 같은 당신은 바로 하나는 10
이로 나누어 될하여 밑이 10 인 숫자의 모든 숫자를 이동 한 경우 비트 시프트에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.80).aspx
위의 명령은 1 비트 씩 오른쪽 시프트를 수행합니다.이 링크에서 c의 비트 단위 작업을 참조하십시오. http://www.cprogramming.com/tutorial/bitwise_operators.html
모든 이항 연산자는 =
과 결합 할 수 있습니다.모든 경우
dest op= expression
dest = dest op expression
동등 (dest
어떤 부작용이있는 경우를 제외하고, 그들은 단지 한번 일어난다).
그래서이
set>>=1;
이 동등하다는 것을 의미 : >>
이후
set = set >> 1;
이진 오른쪽 시프트 연산자이고, 그 오른쪽으로 1 비트 씩 set
의 값을 전환하는 것을 의미한다.
고맙습니다. – Rotom92
@ Rotom92 환영합니다 Rotom :) –