2012-08-24 9 views
0

특정 작업을 수행 할 수있는 번호가 있습니다. 작업 후 숫자가 여전히 나눌 수 있는지 확인하려고합니다. 작업 후 숫자가 나눌 수 있는지 알아야합니다.

이의 내가

PAGE_S

으로 나누어 정수 X가 있다고 가정하자이 PAGE_S으로도 나눌 정수를 생산합니까?

x^ ~(PAGE_S-1); 

이렇게 (x % PAGE_S) == ((x^ ~(PAGE_S-1)) % PAGE_S)? 는 지금까지 내가 테스트, 그것은 작동하지만, 나는 이것이 실제 주소

답변

2

예에 가상 메모리 주소를 변환하는 코드의 일부입니다 ... 왜

PS를 이해하는 것이 필요하지만, 경우에만 PAGE_S가있다 2의 힘.

PAGE_S이 2의 거듭 제곱이면 (예 : 2 ) 이진 표현은 1이고 그 뒤에 k0가옵니다. 따라서 PAGE_S-1은 이진수에서 k1이되므로 ~(PAGE_S-1)은 모두 1이고 그 뒤에 k0가옵니다.

xor 연산 (^)은 두 번째 피연산자의 해당 비트가 1 인 첫 번째 피연산자의 비트를 뒤집습니다. 예를 들어, 첫 번째 3 비트가 뒤집 혔기 때문에 101101^111000은 010101입니다.

xPAGE_S으로 나눌 수 있기 때문에 마지막 k 비트는 0이어야합니다. ~(PAGE_S-1)의 마지막 k 비트도 0이기 때문에 x^~(PAGE_S-1)의 마지막 k 비트는 0이므로 PAGE_S으로 나눌 수 있습니다. 이것은 또한 x의 다른 모든 비트를 반전시킵니다.