2014-12-26 1 views
2
나는 현재 내가 말하는 연습 2-7, 해결 K & R.에서 "C 프로그래밍 언어"와 C를 배우고

: 시작 n 비트 x을 반환하는 함수 invert(x,p,n) 쓰기K & R 운동 2-7, 최적화?

p 위치가 반전 됨 (즉, 1이 0으로 변경되고 그 반대의 경우), 다른 비트는 변경되지 않습니다.

#include <stdio.h> 

#define NUMBER 235 
#define POSITION 2 
#define AMOUNT 4 

unsigned invert(unsigned char x, char p, char n) 
{ 
    unsigned char bitsToInvert = 0, i; 

    for (i = 1; i < n; i++) { // Make a number n-bits width, full of 1 
     bitsToInvert |= 1; 
     bitsToInvert <<= 1; 
    } 
    bitsToInvert |= 1; 

    bitsToInvert <<= p; 

    x ^= bitsToInvert; 

    return x; 
} 

int main() 
{ 
    printf("%d\n", invert(NUMBER, POSITION, AMOUNT)); 
} 

내 코드를 가져올 수있는 최적화가 있습니까 : 여기

내 코드 (여기에 내가 자발적으로 사용되는 문자)인가? 특히 for 루프에서 n 1 비트를 생성합니까? 감사합니다.

+2

'2^n - 1' 또는'(1 << n) -1'은 마지막 n 비트를 설정합니다. :) – SuperSaiyan

+0

적어도 "unsigned chars"를 사용해야합니다. – Jasen

+0

비트의 범위를 설정하도록 요청하는 다른 연습이 있습니다. 이것은 단지 xor 일뿐입니다. – harold

답변

2

2^n - 1은 항상 n LSB 비트가 설정된 숫자입니다. 예를 들어

:

2^3 - 1 = 7 => 111 
2^5 - 1 = 31 => 11111 

귀하의 경우, 당신은 단순히 말에서 떨어져이 번호를 건설하는 for 루프로 수행 할 수 있습니다

bitsToConvert = (1<<n) - 1; 

망가 극단적 인 상황을 돌볼 것을 잊지.

+0

감사합니다. 그것에 대해 충분히 생각하지 않았습니다. ^^ – GilDev

0

Thrustmaster가 말한 것과 달리, "n"을 지정하지 않아도 작동 할 수있는 대안은 비어있는 값에 bitwise를 사용하지 않을 것입니다.

variable = ~(variable^variable);