关于C ++中的左移运算符

时间:2017-06-21 16:10:35

标签: c++ shift

当我执行时,我对左移操作符有疑问 -

int n=(1<<1);
cout<<n;

输出:2

int n=(1<<(1<<1));
cout<<n;

输出:4

但是,当我做的时候 -

int n=(1<<(1<<(1<<1));
cout<<n;

输出:16

在最后一种情况下,输出不应该是8吗?为什么要给16?

6 个答案:

答案 0 :(得分:8)

int n=(1<<(1<<(1<<1));
=> int n=(1<<(1<<2));
=> int n=(1<<4); // which is to say, 2 to the power of 4
=> 1 -> 2 -> 4 -> 8 -> 16

所以它应该显示16。

答案 1 :(得分:5)

由于1 << n = 2^n很容易评估:

(1<<(1<<(1<<1)) = 2^(2^(2^1)) = 2^4 = 16
  • 此处x^y表示x提升到y的力量,而不是C++ XOR运算符。

答案 2 :(得分:2)

这是运算符优先级的基本情况。将首先评估最里面的括号,这将链接到最外面的括号。所以,对于最后一种情况,它将会出现

(1<<(1<<(1<<1))) => (1<<(1<<2)) => (1<<4) = 16

答案 3 :(得分:2)

也许你把它归为一类:

如果你这样做:

int n=(((1<<1)<<1)<<1);
cout<<n;

输出为(((1<<1)<<1)<<1) = (((2)<<1)<<1) = ((4)<<1) = 8

请记住,移位运算符<<的左操作数是要应用移位的数字,右操作数是要移位的n位。

因此,如果将其向后组合,则会移动rigth操作数(要移位的n位)。

int n=(1<<(1<<(1<<1)));
cout<<n;

输出为(1<<(1<<(1<<1))) = (1<<(1<<(2))) = (1<<(4)) = 16

答案 4 :(得分:1)

每次向左移动时,您将数字增加到2的幂。

第一个表达式(1<<1)2^12 第二个表达式(1<<(1<<1))( 1<< (2) ) 2^24

最后一个表达式(1<<(1<<(1<<1)))只是(1<<(4))4^216

答案 5 :(得分:0)

二进制的十进制数1是:1; 2 ^ 0

当你向左移动时,它变为:10; (1 <&lt; 1)

下一次执(1 <&lt; 2)

之后的那个:1&lt;&lt; 4这使得......你猜对了 - 10000 = 16; (1 <<;&LT; 4)

我希望这有助于某人。