网站首页 > 技术文章 正文
左移和右移运算符
C语言提供了左移和右移运算符,例如“<<”是左移运算符,“>>”是右移运算符。使用格式如下:
(1) V << N,表示数值V左移N位;
(2) V >> N,表示数值V右移N位;
(3) 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数值。
猜你喜欢
- 2025-06-12 一文学会Python中的运算规则!(python中//运算)
- 2025-06-12 Go 语言结构 – 基础篇(语法、数据类型、变量、常量、运算符)
- 2025-06-12 3D旋转玫瑰花:python-matplotlib实现
- 2025-06-12 三、Lua基础语法(lua语法大全)
- 2025-06-12 C语言 奇技淫巧之"位运算"
- 2025-06-12 python开三次方根函数怎么编写,两种设计方法
- 2025-06-12 详解Python整数类型的按位运算(python整数的位数)
- 2025-06-12 轻松办公-OfficeExcel函数精解(197)数学和三角之POWER函数
- 2025-06-12 calloc和realloc的使用以及二级指针作为函数参数的输入和输出
- 2025-06-12 python 自学-框架学习-变量和简单的类型(下)
- 06-13C++之类和对象(c++中类和对象的区别)
- 06-13C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 06-13C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 06-13Windows 10下使用编译并使用openCV
- 06-13C语言进阶教程:栈和队列的实现与应用
- 06-13C语言这些常见标准文件该如何使用?很基础也很重要
- 06-13C语言 vs C++:谁才是编程界的“全能王者”?
- 06-13C语言无锁编程指南(c语言锁机代码)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)