2017-03-14 3 views
0

FitsBits를 오랫동안 쓸 때 몇 가지 문제가 발생하므로 테스트 프로그램에 적합한 해결책을 찾지 만 그게 무슨 뜻인지 알 수 없습니다.비트 연산 : FitsBits

문제 설명 :

fitsBits - X가 N 비트 2의 보수 정수로 표현 될 수 있다면 반환 1.
1 < < = N = 32
예 :

fitsBits (5,3) = 0 fitsBits (-4,3) = 1
법적 OPS! ~ &^| + < < >> 최대의 작전 : 15

권리 솔루션은 즉!

int fitsBits(int x, int n) 
{ 
int move; 
move = 32 +(~n+1); 
return !(x^((x<<move)>>move)); 
} 

하지만

를 모르는 (X^((X < < 이동) >> 이사))

는 무엇을 의미합니다.

정말 도움이 필요합니다 .Thx!

답변

1

이 질문은 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)) 
+1

감사합니다 다음

!(3^3) == true; 

이 기능은 정말 않는 요약하면 찾을 것입니다! 당신이 정말로 나를 도왔습니다. – HumbertZhang