2016-01-26 36 views
-2

你好,感謝任何有機會引導我朝着正確方向發展的人。我對C編程完全陌生,對於一個類,我必須編寫一個名爲rearrangeBits的函數,它將採用一個8位整數,將其轉換爲二進制等值,並將有效位全部移到左邊。因此,舉例來說,如果我通過在25號(0001 1001),該函數返回1110 0000。老師給我們這一點入手:在C中重新排列比特

uint8 rearrangeBits(uint8 v) 
{ 
    /* Your code goes here */ 
} 

我一個解決方案,嘗試如下:

uint8 rearrangeBits(uint8 v) 
{ 
    unsigned int i; 
    char bits = 0; 
    int a = 7; 

    for(i = 7; i > 0; i--) 
    { 
     int test = v >> i; 

     if(test & 1) 
     { 
      bits |= (1 << a); 
      a--; 
     } 
    } 


    return bits; 
} 

再次感謝您的幫助,我,最好不尋找答案,但我應該如何正確地處理這個一些指導。

+1

您必須使用'unsigned'類型。位一直向左移動的是未定義行爲*,用於「signed」類型。 'char bits = 0;' - >'uint8_t bits = 0;' –

+0

兩個掩碼 - 一個與與參數在一起測試一個位,一個與或與結果設置一點,如果需要。 –

+1

不是真的重複,但肯定會幫助 - [你如何設置,清除和切換在C/C + +單一位?](http://stackoverflow.com/questions/47981/how-do-you-set-clear -and-toggle-a-single-in-cc) –

回答

0

您的解決方案似乎是正確的,但要經過所有的位。這應該是快了一點,因爲它需要操作只是在1位:只需在每一步

signed char bits = -128; 
if (v == 0) 
    return 0; 
while ((v = v&(v-1)) != 0) { 
    bits >>= 1; 
} 
return bits; 

這從v刪除最低設定位和移位符號結果的右側,即與其他填充它1在左邊。

+0

你爲什麼設置bits = -128?那是爲了確保它會長8位?也謝謝你的回答完美。 –

+0

不,它只是初始值 - 最高位設置。 –

+0

啊好吧,非常感謝 –