2017-02-24 137 views
0

我對位操作相當陌生,所以如果你能幫助我,那就太棒了!當你比較兩個不同的字節時,我明白了什麼(&,|,〜,^)。我也明白,(< <)就像乘以2^i位一樣,(>>)就等於除以2^i位。我已經嘗試過,但我認爲有更好的方法來做到這一點。家庭作業幫助(位操作)

這裏的問題:

收件,用於設置一個整數一定數目的比特爲1,並且所有其它位爲0的值應該從函數返回的功能。例如,當將整數x = 3和y = 8傳遞給該函數時,該函數應該返回二進制數爲00000000 00000000 00000111 11111000的整數。也就是說,將第3到第11(3 + 8)提示:此函數有兩個參數:起始位數和從起始位開始計數的位數。應該使用逐位添加和移位。

這是我到目前爲止有:

int function(int startBit, int numBits){ 
    int num = 0; 
    int num1 = 1; 
    int i; 

    for(i = startBit; i < startBit+numBits; i++){ 
      num = num | num1 << i; 

    } 
    return num; 
} 

提前感謝!

+0

忘記.......... –

回答

0

該解決方案是有點慢,但符合要求:

// First, create the number of 1 bits needed 
int result = 0; 
for (i = 0; i < numBits; ++i) 
    result = (result << 1) + 1; 

// Then shift the 1 bits to the correct position 
result <<= startBit; 
+0

唉,完美的非常感謝! –

0

通常位玩弄的是這樣的:

((1 << numBits) - 1) << startBit 

,但我不知道你的滿足「按位addtion和移位,應使用」的限制。

+0

時(1 << numBits) > INT_MAX它的價值將包裹OP的例子是64位,所以這隻有在numBits <32(或在ILP64:numbits <64)時纔有效。除此之外,這是一個很好的簡化。 –

+0

是的,你一定要注意數據類型以及numBits和startBit的值,否則你會最終會出現錯誤的結果,這些類型的位有許多種,它們通常用於硬件控制寄存器的上下文中,其中numBits和startBit的值是常量,其值是re這個定義很明確。 –