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

之前在学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位机。

发现若是左移超过了存储单元长度,那么此次位移的结果就是位移位数减去存储单元长度后再进行位移的结果。

相关文章
相关标签/搜索