2014-09-16 2 views
0

I이 수행하는 기능을 할 예정입니다 : (함수의 코드가 지금까지있어 것입니다!)함수를 만드는 것은 upperBits

* upperBits - pads n upper bits with 1's 
* You may assume 0 <= n <= 32 
* Example: upperBits(4) = 0xF0000000 
* Legal ops: ! ~ &^| + << >> 
* Max ops: 10 
* Rating: 1 
*/ 
int upperBits(int n) { 

    int x; 
    x = (x << n) - 1; 
    return (x << (32-n)); 
} 

기능이 때 입력을 제외한 모든 시간을 작동 0 (upperBits(0))이면 0 일 때 출력은 0xffffffff입니다. 이것을하는 방법을 모른다.

+1

int x; 뒤에 if (n == 0) return 0;을 삽입 할 수 있습니다. – lurker

+0

if 문은 비트 연산자 만 사용할 수 없습니다. – drleifz

+0

먼저 가지고있는 것을 수리해야합니다. 'x'가 국부적으로 선언되고, 초기화되지 않았을 때 확실히 좋지 않을 것입니다. 그리고 여러분은'(x << n) - 1' 식에서 그것을 사용하고 있습니다. 아마도'x'는 이러한 경우에 당신을 위해'0'을 기본값으로 사용하지만, 확실히 문제입니다. 문제는 C에서'0xFFFFFFFF << 32'가'0xFFFFFFFF' (''32'는 무시됩니다)라는 재미있는 행동을 강조합니다. – lurker

답변

0

독자가 직접 알아 내려고하기 때문에 몇 가지 실마리를 제공 할 것입니다. 이것은 하나의 특별한 접근법입니다. 이를 수행하는 다른 똑같이 좋은 방법이있을 수 있습니다.

이 함수는 인수로 32의 값 제외 작동한다 : C는 32의 변화를 무시하기 때문 n == 32 작동하지 않는

int upperBits(int n) { 
    return ~(0xFFFFFFFFU >> n); 
} 

. 교대조를 두 조각으로 나누어서 n까지 합쳐서 이것을 지나칠 수 있습니다. 즉 :

return ~((0xFFFFFFFFU >> x) >> y); 

xyn를 추가 할 경우. 허용 연산자를 사용하여 n을 조작하여 xy을 생성하는 아주 간단한 방법이 있습니다. 이것을 인라인으로 할 수도 있고 변수 xy을 선언 할 필요가 없습니다.

+0

나는 2 개의 조각으로 교대를 나누기의 아이디어를 얻는다 그러나 나는 어떻게 든이 비트 이동하고 조금 현명한 통신 수의 주위에 나의 머리를 완전히 감쌀 수 없다.어쩌면 그것은 연습과 함께 제공됩니다 : ( – drleifz

+0

@drleifz 만약 당신이 비트 조작에 익숙하지 않다면 그래프 용지를 얻고 비트 사진을 많이 그려보십시오. 정말 도움이됩니다! C에서'<<' and '>>'연산자는 부호없는 정수를 0으로 채 웁니다. 따라서'0xFFFFFFFFU >> 1'은'0x7FFFFFFFU'입니다. 부호있는 정수를 수행하는 경우 상위 비트 (32 비트 수 31)가 무엇이든 상관없이 * 시프트 오른쪽 *이 * 부호 확장 *을 표시합니다. 따라서이 경우 부호있는 시프트 인 '0xFFFF0000 >> 1'은 '0x7FFF8000'이 아닌'0xFFFF8000'이됩니다. – lurker

+0

팁 주셔서 감사! 예, 비트 조작에 대해 생각할 때 실제로 그려주는 것이 도움이 될 것이라고 생각합니다. :) – drleifz

관련 문제