2013-10-08 61 views
4

我知道這是一個常見問題,我不知道爲什麼我有這麼多麻煩。我想行從IDL代碼轉換爲C++如何在C++中移位整數值

IDL:

for i = 0,7 do begin 

    b = ishfy(b,1) 
    print,b 

endfor 

我的C++代碼:

for(int i = 0; i < 7; i++) 
    { 
     b = b << 1; 
     cout << b; 
    } 

我最初b爲255,我希望收到254, 252,等等。相反,我的第一個位移返回510.我假設我的問題不是在轉換之前將b轉換爲二進制形式。它是否正確?如果是這樣,我該如何解決它?

在此先感謝!

+0

你看到什麼是預期的:你有'0b11111111',當移位1時爲'0b111111110',即510. – juanchopanza

+0

255爲1111_1111基數2.當使用<< << 1»時,您將所有位移到左邊。所以,這有相同的行爲乘以二:1_1111_1110基數二是510基數10. –

+1

我想你可能想'(b << 1)&0xff' –

回答

5

< <向左移動。如果B最初爲255(二進制11111111),並且將它向左移一位,則得到111111110(在大多數機器上,一個整數是32位寬,所以有0的空間),即十進制數爲510。

所以,這個程序正常工作100%。

如果你想讓它「砍掉」高位使b成爲一個8位寬的類型,比如char,或者用0xFF進行AND操作。

+0

或用0xFF掩蓋它。字符可能不是8位寬。 – vcsjones

+0

好點。編輯我的帖子... –

1

看來你想清除最低有效位。 左移運算符<<不這樣做。

在這種情況下,你可以做到以下幾點:

for(int i = 0; i < 7; i++) 
{ 
    b &= (b - 1); 
    cout << b; 
} 

所以,你必須:

1st it: 11111111 & 11111110 = 11111110 = 254 
2nd it: 11111110 & 11111101 = 11111100 = 252 
3rd it: 11111100 & 11111011 = 11111000 = 248 
4th it: 11111000 & 11110111 = 11110000 = 240 

....

+2

這假定'b'最初是2的冪減1。不過,在他的情況下,保證是這種情況。 –

+0

@GovindParmar +1,好點! –