向左移位運算符我有關於左移位操作這個疑問,當我perform-關於在C++
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?
向左移位運算符我有關於左移位操作這個疑問,當我perform-關於在C++
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?
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<<(1<<(1<<1))) => (1<<(1<<2)) => (1<<4) = 16
由於1 << n = 2^n
很容易評價:
(1<<(1<<(1<<1)) = 2^(2^(2^1)) = 2^4 = 16
x^y
表示x
提高到y
的力量,而不是C++
XOR運營商。您將如何評價(4 << 16)? –
'x << y = x *(2^y)' –
也許你分組它向後:
如果你這樣做:
int n=(((1<<1)<<1)<<1);
cout<<n;
輸出將被(((1<<1)<<1)<<1) = (((2)<<1)<<1) = ((4)<<1) = 8
記住移位運算<<
的左操作數是要應用的數量移位,右操作數是你想要移位的位。所以,如果你將它分組,那麼你正在移動rigth操作數(你想要移位的n
位)。
int n=(1<<(1<<(1<<1)));
cout<<n;
輸出將被(1<<(1<<(1<<1))) = (1<<(1<<(2))) = (1<<(4)) = 16
你左移每一次,你正在遞增數爲2的
第一個表達式(1<<1)
功率爲2^1
這是2
。
第二個表達式(1<<(1<<1))
是(1<< (2))
其是2^2
或4
最後一個表達式(1<<(1<<(1<<1)))
只是(1<<(4))
其是4^2
或16
。
二進制中的十進制數1是:1; 2^0
當你將它左移時它變成:10; (1 < < 1)
下一次執行的操作將會是1 < < 2這導致:100 = 4; (1 < < 2)
而後面的那個:1 < < 4這使得......你猜對了 - 10000 = 16; (1 < < 4)
我希望這有助於某人。
您是否試圖根據圓括號優先規則手動評估它? –
你爲什麼期望它給8? –
@MartinBonner我認爲期望再次改變了一次,而不是被提升到某種東西的力量。 – AntonH