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

JL2*_*210 0 c++ cout bit-shift

我正在尝试做类似的事情:

#include <iostream>

int main()
{
    std::cout << 1 << 5 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试使用这样的宏:

#define BIT_SHIFT(x,y) x << y
...
cout << BIT_SHIFT(1, 5) << std::endl;
Run Code Online (Sandbox Code Playgroud)

而这发生了。

为什么?我该如何解决?

Yks*_*nen 6

只需使用括号。

#include <iostream>

int main()
{
    std::cout << (1 << 5) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

std::cout << 1 << 5表示“先输出流1,然后输出整数5”。但是,添加括号会改变求值顺序,并且1 << 5首先被求值,从而产生std::cout << 32 << std::endl;表达式。


πάν*_*ῥεῖ 5

使用括号:

    std::cout << (1 << 5) << std::endl;
Run Code Online (Sandbox Code Playgroud)

原因是输出ostream& operator<<(ostream&, const T&)重载链接了返回值以再次调用该函数。

如果使用括号,则将首先计算位移值,然后将其传递给重载的输出运算符。


我试图在宏中使用它:...

因此,上面所说的宏定义应如下所示:

#define BIT_SHIFT(x,y) ((x) << (y))
Run Code Online (Sandbox Code Playgroud)

您可能想知道为什么现在要加上括号。这只是更安全地编写宏。想像一下有人尝试使用您的宏:

 cout << BIT_SHIFT(1, 5*2) << std::endl;
Run Code Online (Sandbox Code Playgroud)