2017-06-21 58 views
-1

向左移位運算符我有關於左移位操作這個疑問,當我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?

+8

您是否試圖根據圓括號優先規則手動評估它? –

+5

你爲什麼期望它給8? –

+1

@MartinBonner我認爲期望再次改變了一次,而不是被提升到某種東西的力量。 – AntonH

回答

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.

2

這是運算符優先級的基本情況。最裏面的括號將首先被評估,並且這將會鏈接到最外面的一個。因此,在過去的情況下,它會去

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

由於1 << n = 2^n很容易評價:

(1<<(1<<(1<<1)) = 2^(2^(2^1)) = 2^4 = 16 
  • 這裏x^y表示x提高到y的力量,而不是C++ XOR運營商。
+0

您將如何評價(4 << 16)? –

+1

'x << y = x *(2^y)' –

2

也許你分組它向後:

如果你這樣做:

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

1

你左移每一次,你正在遞增數爲2的

第一個表達式(1<<1)功率爲2^1這是2
第二個表達式(1<<(1<<1))(1<< (2))其是2^24

最後一個表達式(1<<(1<<(1<<1)))只是(1<<(4))其是4^216

0

二進制中的十進制數1是:1; 2^0

當你將它左移時它變成:10; (1 < < 1)

下一次執行的操作將會是1 < < 2這導致:100 = 4; (1 < < 2)

而後面的那個:1 < < 4這使得......你猜對了 - 10000 = 16; (1 < < 4)

我希望這有助於某人。