2014-12-26 119 views
2

我正在學習用「C程序設計語言」 C給K & R.我解決了鍛鍊2-7,其中說:K&R練習2-7,優化?

寫一個函數invert(x,p,n),與n比特開始返回x在位置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循環中創建了多少個位? 謝謝!

+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」而不需要指定它,它將使用不是空值的按位。

variable = ~(variable^variable);