簡體   English   中英

如何在 cout 中使用按位移位?

[英]How do I use bitwise shifts with cout?

我正在嘗試做類似的事情:

#include <iostream>

int main()
{
    std::cout << 1 << 5 << std::endl;
}

我期望 32(1 左移 5),但我得到 15。

我正在嘗試使用這樣的宏:

#define BIT_SHIFT(x,y) x << y
...
cout << BIT_SHIFT(1, 5) << std::endl;

這發生了。

為什么? 我該如何解決?

只需使用括號:

#include <iostream>

int main()
{
    std::cout << (1 << 5) << std::endl;
}

std::cout << 1 << 5表示“推送到輸出流第一個整數文字1 ,然后是整數5 ”。 但是,添加括號會改變計算順序,首先計算1 << 5 ,導致std::cout << 32 << std::endl; 表達。

使用括號:

    std::cout << (1 << 5) << std::endl;

原因是輸出ostream& operator<<(ostream&, const T&)重載鏈接返回值以再次調用該函數。

如果使用括號,則首先計算位移值,然后將其傳遞給重載的輸出運算符。


我試圖在宏中使用它:...

因此上面說你的宏定義應該是這樣的:

#define BIT_SHIFT(x,y) ((x) << (y))

你可能想知道為什么現在有額外的括號。 這只是更安全的編寫宏。 想想有人嘗試使用您的宏,例如:

 cout << BIT_SHIFT(1, 5*2) << std::endl;

我正在嘗試做類似的事情:

 #include <iostream> int main() { std::cout << 1 << 5 << std::endl; }

你是對的。 您正在嘗試做類似的事情。 但是,問題與宏無關(我的意思是,這也是一個問題,但稍后會詳細介紹)。 問題是你的目標不是你的意思。 你不是說std::cout << 1 << 5 << std::endl; ,你的意思是std::cout << (1 << 5) << std::endl; 不同之處在於第一個分解為這樣的:

std::cout << 1;
std::cout << 5;
std::cout << std::endl;

雖然你想要的是這樣的:

int i = 1 << 5;

std::cout << i;
std::cout << std::endl;

或者類似的東西。

答案很簡單:要么在cout語句中使用括號,要么將它放在宏中(更好的選擇):

// either 
cout << (BIT_SHIFT(1, 5)) << std::endl;
// or
#define BIT_SHIFT(x,y) (x << y)
...
cout << BIT_SHIFT(1, 5) << std::endl;

此外,正如其他人所建議的,如果您願意,您甚至可以更進一步:

#define BIT_SHIFT(x,y) ((x) << (y))
...
cout << BIT_SHIFT(1, 5) << std::endl;

這樣,如果您在xy做了一些奇怪的事情,您的代碼就不會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM