当我执行时,我对左移操作符有疑问 -
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?
答案 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^1
,2
第二个表达式(1<<(1<<1))
为( 1<< (2) )
2^2
或4
最后一个表达式(1<<(1<<(1<<1)))
只是(1<<(4))
,4^2
或16
。
答案 5 :(得分:0)
二进制的十进制数1是:1; 2 ^ 0
当你向左移动时,它变为:10; (1 <&lt; 1)
下一次执(1 <&lt; 2)
之后的那个:1&lt;&lt; 4这使得......你猜对了 - 10000 = 16; (1 <<;&LT; 4)
我希望这有助于某人。