[英]Why are bitwise shifts (<< and >>) used for cout and cin?
[英]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;
這樣,如果您在x
或y
做了一些奇怪的事情,您的代碼就不會中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.