2016-09-20 113 views
-1
#include <iostream>  

int main() 
{ 
    using namespace std; 

    int number, result; 

    cout << "Enter a number: "; 
    cin >> number; 
    result = number << 1; 
    cout << "Result after bitshifting: " << result << endl; 
} 

如果用戶輸入12,則程序輸出24在C++中移位二進制數字

在二進制表示中,120b1100。但是,程序打印的結果是十進制的24,而不是80b1000)。

爲什麼會發生這種情況?我怎樣才能得到我除了的結果?

+1

請閱讀文檔,瞭解如何在stackoverflow上發佈問題。 – user3286661

+0

您可以使用std :: bitset輕鬆處理位級操作。 – seccpur

+0

「int」至少爲16位(具體而言,它必須足夠大以保持範圍爲-32,767..32,767 \ [signed]或0..65,535 \ [unsigned \]的任何整數,這需要最小值的16位),但可能更多(通常,但不總是32位)。因此,在標準平臺上移動的數字通常不是「0b1100」,而是「0b0000000000001100」。如果您想將數字視爲4位數的二進制數,您應該使用std :: bitset來爲您提供更好的控制,正如@seccpur上面所說的,或者是一個掩碼,正如答案指定和說明的那樣。 –

回答

0

爲什麼程序輸出24

你是對的,120b1100的二進制表示形式。這就是說,如果你願意,它也是0b001100。在這種情況下,向左移位會產生0b011000,即24。該程序產生例外的結果。

此站點在哪裏?

您正在使用一個int變量。當目標爲32位時,其大小通常爲4個字節(32位)。然而,依靠int的大小是一個壞主意。當需要特定大小的變量時使用stdint.h

警告對bitshifting超過符號類型

使用<<位位移操作在爲負值的詞是未定義的行爲。 >>對負值的行爲是實現定義的。在你的情況下,我會建議你使用unsigned int(或只是unsigned這是相同的),因爲int簽名。

如何得到你的結果除外?

如果知道用戶輸入的數字的大小(以位爲單位),則可以使用&(按位與)運算符來使用位掩碼。例如

result = (number << 1) & 0b1111; // 0xF would also do the same