概述
C语言提供了左移和右移运算符,例如“<<”是左移运算符,“>>”是右移运算符。使用格式如下:
- V << N,表示数值V左移N位;
- V >> N,表示数值V右移N位;
- V可以是某个变量,就是操作变量V中的数值;
在计算机系统中,存储在内存中的数据都是二进制数据。下面举几个例子:
(1) 例如3这个数值,存储在1个字节的空间中,其二进制格式是0000 0011,如果我们把这个数值往左移动2位,那么,就得到0000 1100,此时,表示的十进制是12。
(2) 例如2这个数值,存储在1个字节的空间中,其二进制格式是0000 0010,如果我们把它往左移动3位,就得到0001 0000,此时,十进制表示16。
那么,我们可以总结:
(1) 数值3往左移动2位,变成12数值;如同3 * 2^2 = 3 * 4 = 12;
(2) 数值2往左移动3位,变成16数值;如同 2*2^3 = 2 * 8 = 16;
那么,我们可以归纳总结,数值N往左移动X位,得到是数值是N*2^X,就是数值N乘以2的X次方。注意:我们这种计算方式,是在不考虑“溢出”的情况下。
在计算机内存中,由于1个字节的容量是8位,如果对1个字节的数据进行“移位”操作,应该考虑“溢出”的情况。例如1100 0010这样的数值,如果往左移动2位,则变成0000 1000,那么,高字节的两位溢出。
如下是一个测试的例子:
测试运行的结果如下:
可以看到,a1变量存放的是a变量的值左移2位,就是3数值左移2为,所以,a1 = 3*2^2 = 3*4 = 12;b1变量的值是b变量的值左移3位,就是2数值左移3位,所以,b1 = 2*2^3 = 2*8 = 16;
操作变量c的左移,是为了测试“溢出”的情况,由于char类型的容量是1个字节,所以,只能够存放8位数据。那么,c变量存储225数值对应的二进制是1110 0001数据,把这个二进制左移3位,就把高3位已移出,低位补0,得到0000 1000二进制,就是8这个数值。
上面我们讲解了“左移”的操作,那么,对于“右移”就很好理解,就是二进制数据往右移动,下面来举几个例子:
(1) 例如8这个数值,它对应的二进制数据是 0000 1000,如果把它往右移动2位,那么,低字节的2位移出,高位补0,就得到0000 0010数据,就是2数值。
(2) 例如19这个数值,它对应的二进制数据是 0001 0011,如果把它往右移动1位,那么,低字节的1位移出,高位补0,就得到0000 1001数据,就是9数值。
此时,我们可以归纳总结:
(1) 数值8往右移动2位,得到2数值,相当于 8 /(2^2) = 8 / 4 = 2;
(2) 数值19往右移动1位,得到9数值,相当于19/(2^1) = 19 / 2 = 9,注意整数除法的操作是“整除取整”,19/2 = 8.5,然后,向上取整,得到9这个数值。
所谓的向上取整,就是小数部分大于等于0.5的时候,就取比当前数值,整部部分大于1的数值。例如8.5这个数,小数部分是0.5,大于等于0.5成立。整数部分是8,那么,向上取整就是整部部分加1,所以,就是8+1=9。
所谓的向下取整,就是取出小数部分,只取整数部分。
那么,数值N往右移动X位,得到是数值是N/(2^X),即N数值除以X的2次方。如下是测试的例子:
程序运行的结果如下:
可以看到,a1变量的值是a变量的值往右移动2位,就是8/(2^2) = 8/4=2;b1变量的值是b变量中的值往右移动1位,就是19/(2^1) = 19/2 = 9。
注意:19/2 = 8.5,现在我们使用的GCC编译器,对整数除法采用“向上取整”的方式,所以,8.5数值,向上取整是9数值。
更多的交流可以访问:www.mylinux.vip 加QQ:1523520001,微信:13926572996,备注:linux编程;
学习、分享更多的linux C/C++ 编程知识。
最后
以上就是安详导师为你收集整理的左移和右移运算符的全部内容,希望文章能够帮你解决左移和右移运算符所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复