之前在學C語言的時候遇到了左移(右移)操做符。在知道這兩種操做符是將一個十進制數的二進制形式按位左移(右移)時,便產生了一個疑問,就是移動時產生的多餘的位是用1補仍是用0補,因而就寫了一個程序驗證一下。c++
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填補的。spa
一個整數x被左移n位時產生的數是x*2ncode
一個整數x被右移n位時產生的數是x/2nblog
後來在學習的過程當中就有了一個想法,那就是若是使用位移運算符使數字強行越界,那麼會產生什麼結果呢?it
先來看右移:class
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位機。
發現若是左移超過了存儲單元長度,那麼此次位移的結果就是位移位數減去存儲單元長度後再進行位移的結果。