2015-02-09 27 views
2

我已經包含了下面的整個代碼,但我唯一想知道的是setBit函數。 x = 1 << bitNum只會移動0001然而很多空間左邊取決於什麼號碼bitNum是,但我不明白最後一行(*u |= x)爲什麼這裏使用的指針?設置0到1之間的一個整數

#include <stdio.h> 

typedef unsigned int uint; 

int checkBit(uint u, uint bitNum); 

void setBit(uint* u, uint bitNum); 

int countOnes(uint u); 

int main() 

{ 
    uint xxx, bitNumber; 

    printf("\n Enter decimal integer xxx: "); 
    scanf("%u", &xxx); 
    printf("\n xxx in decimal: %u", xxx); 
    printf("\n xxx in hex: %x", xxx); 

    ////// Test countOnes function ///////////// 
    printf("\n Number of ones in xxx: %d", countOnes(xxx)); 

    ////// Test checkBit function ///////////// 
    printf("\n Enter bit to check: "); 
    scanf("%u", &bitNumber); 
    printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber)); 
    printf("\n Enter bit to check: "); 
    scanf("%u", &bitNumber); 
    printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber)); 

    ////// Test setBit function ///////////// 
    printf("\n Enter bit to set: "); 
    scanf("%u", &bitNumber); 
    printf("\n Setting bit %d of xxx", bitNumber); 
    setBit(&xxx, bitNumber); 
    printf("\n xxx in hex: %x", xxx); 
    printf("\n"); 

    return 0; 
} 

int countOnes(uint u) 
{ 
    int bitCount; 

    for(bitCount = 0; u; u = u >> 1) 
    { 
     bitCount += u & 1; 
    } 

    return bitCount; 
} 

void setBit(uint* u, uint bitNum) 
{ 
    int x; 
    x = 1 << bitNum; 
    *u |= x; 

} 

int checkBit(uint u, uint bitNum) 
{ 
    int x = u >> bitNum; 

    if(x & 1 == 1) 
     return 1; 
    else 
     return 0; 
} 
+1

* u用於設置u指向的整數位。 – 2015-02-09 08:11:27

回答

1

爲什麼在這裏使用的指針?

沒有該指針參數,對所需變量的更改將不會反映在main()中。

僅供參考,C在參數傳遞中使用按值傳遞。因此,您需要傳遞變量的地址並將其收集到一個指針中,以便將變化反映到main()中的實際變量中。

根據代碼邏輯站,您收到的參數是uint* u。因此要在指針所保存的地址上操作值,您需要解除引用運算符*。其實

*u |= x; 

行爲就像

(*u) |= x; 

因爲operator precedence,這基本上是告訴

「在X與價值獲取地址用u指向的值,或它並將其存儲到你指出的地址「

2
*u |= x; 

上面的行ORs是由u指向的位掩碼x的整數。

由於setBit()接收到指向整數(uint * u)的指針。要更改該整數,您必須將其解決爲* u

+0

接受答案,如果它回答:) – 2015-02-09 08:52:55

0

(* u | = x)。爲什麼這裏使用了一個指針?

在上面的語句,u是指針,但是當你把一個間接運算符*在指針u的前面,如*u,你解引用指針檢索值指出由指針。

0

指針最有可能用於減少重複。另一種方法是:

uint setBit (uint u, uint bitNum) 

xxx = setBit (xxx, bitNumber); 

如果你只打算使用它來設置到位了一下,然後將鼠標指針避免了兩次指定變量的名稱。此外,它也避免了意外產生的代碼,什麼也不做,這樣的可能性:

setBit (xxx, bitNumber); 

這什麼也不做,因爲返回值被忽略。隨着指針的功能,這個錯誤是不可能的。

相關問題