이 질문은 Bitwise operations and shifts의 중복이며 사용자가 동일한 코드를 이해하도록 요청합니다. 불행히도 나는 그것을 표시하는 평판이 없다.
은의 당신이 발견 솔루션보다 설명에 따라 일부 수정과, Code-Apprentice's 대답하고 AnT's을 유지하려면 내 자신의
move = 32 +(~n+1);
이 실제로 32의 차이 (N의 최대 값 및 크기 이 문제의 정수)와 n.
부호가있는 정수를 2로보아야하는 이유를 이해해야합니다. 이 포맷에서는
~5 + 1 = -5
또는
~(0101) + 1 = 1011
공지 방법 1011 수없고, -5에 비트를 반전 한 첨가를 통해 5 (0101), 원래의 실시 예에서, 예를 들어, 부호없는 정수로 변환 음수 (2S 보수의 음수는 1로 시작 함)
그래서
move = 32 +(~n+1);
비트에 적합하고 여전히 617,451,515,
는 마지막 행은 그렇게 분해 할 수 실제로 한 줄
!(x^((x<<move)>>move));
몇 가지 아이디어입니다 실제로
move = 32 - n;
입니다.
invert the truthiness of
(x xor a number)
where the number is x first shifted left then right amount move
and move is the difference between n and 32.
다시 5와 3 예를 사용하십시오. 이동은 32-3이어야하므로 이동은 29입니다.
왜 왼쪽과 오른쪽이 같은 양으로 이동합니까? 일반적으로 코드에서이 작업을 수행하는 것을 볼 때 숫자에서 '제로 아웃'을 시도하고 있습니다. 이 경우 작성자는 그렇게하지 않고 확장 서명을합니다. 예를 들어
아래 봐 :
given 0000 0000 0000 0000 0000 0000 0000 0101 = 5
5 << 29 = 1010 0000 0000 0000 0000 0000 0000 0000 = -1610612736
-1610612736 >> 29 = 1111 1111 1111 1111 1111 1111 1111 1101 = -3
을 A가 서명으로 번호가 밖으로 시작하면 저자는, RSHIFT의 구현 수준의 특질을 사용하고, 그것의 기호를 유지하고 기호는 숫자의 나머지 부분을 채우고 그 이동.
부호가 채워져 있기 때문에 (5 >> 29) < < 29는 32 비트 부호있는 끝의 끝으로 5를 이동했을 때 1로 시작했기 때문에 같은 숫자가되지 않습니다. 자체 서명했다.
다음 라인은 훨씬 간단
(x^number)
0 일 경우 X == 번호 0 XOR 1 = 1, 1 XOR 1 = 0, 0 XOR 그것에 의하여 따라서 0 = 0 보낸 우리는 x의 truthiness를 반전 할 때 로직, 우리가 확인하는 경우
x == (sign shifted x)
5 말해봐, 8 대신 (1000) 우리는 단순히 마지막 숫자 (1)을 잃게 우리가 알아낼 것이었다
!(8^0) == false.
3 = 011 이래 실제로 작동 한 번호 (예 : 3)를 사용하고 3을 29로 오른쪽으로 이동하면 첫 번째 비트가 0이되고 앞뒤로 이동할 때 3의 값이 유지됩니다. 그래서 우리는
given int x and int n,
check if x == (x shifted left then sign shifted right by (size of int in bits - n))
감사합니다 다음
이 기능은 정말 않는 요약하면 찾을 것입니다! 당신이 정말로 나를 도왔습니다. – HumbertZhang