는이 사이트에이 기능의 몇 가지 다른 구현을 봐 왔지만, 누군가가 나를 알아내는 데 도움이 할 수있는 경우이 구현은 작동하지 않는 이유가 궁금 : 그래서비트 연산 : fitsBits 기능
//fitsBits: return 1 if x can be represented as an n-bit, two's complement integer.
//1<=n<=32
//Examples: fitsBits(5,3)=0, fitsBits(-4,3)=1
//legal ops: ! ~ &^| + << >>
//Max ops: 15
int fitsBits(int x, int n) {
int mask = ~(1<<31);
return !(((x>>1)&mask)>>(~(~n+2)+1));
}
당신은 내 논리를 조금 따라갈 수 있습니다, 나는 잠재적으로 여분의 1 (산술 이동)을 노출시킬 수있는 오른쪽으로 한 x 이동합니다. 그래서 나머지 x를 이동하기 전에 마스크가 0인지 확인합니다. 원래는 x n 배를 오른쪽으로 이동해야하고, 1 초 이상 남아 있으면 x가 n 비트가 맞지 않는다는 것을 의미합니다. x를 오른쪽으로 1 비트 이동 했으므로 이제 n-1 번 이동해야합니다.
내가 얻는 결과는 : 당신이 - 제가 숫자에 대한 권리 변화는 "구현 정의"하는 C와 같은 외모를 서면으로 작성했습니다, 그래서 또는 산술 변화하지 않을 수 있습니다 무엇
ERROR: Test fitsBits(2147483647[0x7fffffff],31[0x1f]) failed...
...Gives 1[0x1]. Should be 0[0x0]