2013-03-29 1 views
4

연습 2-6. 위치 p에서 시작하는 n 비트가 y의 가장 오른쪽 n 비트로 설정되고 다른 비트는 변경되지 않은 상태로 x를 반환하는 함수 setbits (x, p, n, y)를 작성합니다.K & R 운동 2-6이 실제로 요구하는 기능은 무엇입니까?

나는이 기능을 종이에 좋은 시간 또는 두 시간 동안 사용하려고 노력해 왔지만 아무 것도 얻지 못하고있다.

함수를 해석하는 방법은 임의의 길이의 비트 필드 x가 가장 오른쪽 비트부터 p 비트를 나타내는 비트를 보는 것입니다. 이 n 비트를 n 비트 필드 y의 임의의 길이에서 가장 오른쪽 비트에있는 동일한 비트로 변경하십시오.

예 : p = 7n = 9 x가 맨 위 필드로, y가 가운데, 결과가 맨 아래 필드입니다.

enter image description here


나는 문제가 나는 임의의 크기의 비트 필드로이 작업을 수행 할 수있는 방법을 결정하는 데

. sizeof(x) * 8을 사용해야합니까, 아니면 불필요한가요?

이러한 기능을 어떻게 구현할 수 있는지에 대한 힌트를 주시면 감사하겠습니다.

나는 운동의 다른 해석을 알고 싶습니다. 가능하다면이 버전을 더 쉽게 수행 할 수 있습니다. 얼마나 오래 복용하고 있는지 감안할 때이 문제에 대한 두 번째 의견을 고맙게 생각합니다. 감사합니다.

+0

이 질문은 루프 날 던지고있다. 난 2-5에서 2-6 사이의 질문 사이에 난이도가 커진 것처럼 느껴집니다. – pdoherty926

답변

3

xy은 int이며 비트 필드의 크기는 정수의 비트 수보다 클 수 없음을 알고 있습니다.

이 값이 C이므로 가장 오른쪽 비트가 # 0이라고 가정하면 p = 0, n = 1x의 맨 오른쪽 비트를 바꾼다는 의미입니다.

싶은 것은 :

  1. 는 비트 마스크 생성 - 가장 오른쪽 n 1로 설정 비트와 숫자를 모두 0 나머지;

  2. andy 비트와 비트 마스크 y 가장 오른쪽 n 비트를 추출하고 p 비트 좌 시프트;

  3. 비트 맵 p 비트를 왼쪽으로 시프트하여 p에서 시작하는 비트에서 작동 할 비트 마스크를 만듭니다.

  4. 비트 단위 and 대체 할 비트를 마스크하기 위해 x 인 역 이동 된 비트 마스크;

  5. 비트 단위 or 결과가 2와 4로 표시됩니다.

롤오버 코드에서 볼 수 있습니다 :

int bitmask = ~((~0) << n); 
return ((bitmask & y) << p) | (~(bitmask << p) & x);

+0

흠, 나는 int의 비트 수가 컴퓨터에 따라 다르다고 생각하지만 항상 틀릴 수도 있습니다. 그런데'x'와'y'가'int' 타입인지 어떻게 알 수 있습니까? – Leonardo

+0

예, 'int'의 비트 수는 기계마다 다르므로 문제가되지 않도록 코드를 작성하면됩니다. 형식을 지정하지 않으면 기본값은'int'입니다. 지정된 유형이 표시되지 않아 기본값으로 간주됩니다. – Gabe

+0

필자는 사용하기 쉽도록 파이썬 쉘을 사용하여 함수를 시험해 보았으며 원하는대로 작동하지 않는 것으로 보입니다. 나는 또한 그것을 손으로했고 결과가 옳지 않다. 손으로'x = 0110 1101''y = 0110 1001''p = 4'' n = 3' 나는'0100 1101'의 결과를 기대하고 있습니다 만, 당신의 기능으로'0000 1101'을 얻습니다. – Leonardo