1. 程式人生 > 實用技巧 >左移操作符(<<)和右移操作符(>>)

左移操作符(<<)和右移操作符(>>)

以前在學C語言的時候遇到了左移(右移)操作符。在知道這兩種操作符是將一個十進位制數的二進位制形式按位左移(右移)時,便產生了一個疑問,就是移動時產生的多餘的位是用1補還是用0補,於是就寫了一個程式驗證一下。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int i = 3;
 8     i = i << 2;
 9     cout << i << endl;
10     return 0;
11 }

程式結果如下:

12

3的二進位制數表示是11,移過兩位後顯示的數字是12,12的二進位制表達是1100,可以得知位移過後產生的空缺是由0填補的。

一個整數x被左移n位時產生的數是x*2n

一個整數x被右移n位時產生的數是x/2n

後來在學習的過程中就有了一個想法,那就是如果使用位移運算子使數字強行越界,那麼會產生什麼結果呢?

先來看右移:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int i = 3;
 8     i = i >> 1;
 9     cout << i << endl;
10 i = 1; 11 i = i >> 2; 12 cout << i << endl; 13 i = 1; 14 i = i >> 3; 15 cout << i << endl; 16 17 return 0; 18 }

執行結果是:

1
0
0

3的二進位制數是11,右移一位是01,於是第一個結果是1,而右移兩位是00,所以第二個結果是0,右移三位以後還是0。由此可以看出因為右移而出界的數字將會被丟失,所以對數字進行右移操作時需要非常謹慎,數字被右移以後的結果可能會失去精度。

如果整數x可以被2^n整除的話,右移n位將會得到正確地結果;反之,如果不能被整除,結果將會是兩數相除的商,而餘數將會被捨棄。

接下來是左移:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int i = 1;
 8     i = i << 64;
 9     cout << i << endl;
10     i = 1;
11     i = i << 65;
12     cout << i << endl;
13 
14     return 0;
15 }

執行結果為:

1
2

首先需要說明的是執行程式的機器是64位機。

發現如果左移超過了儲存單元長度,那麼這次位移的結果就是位移位數減去儲存單元長度後再進行位移的結果。