C基础之移位操作
因为左移操作不会导致符号位出现缺位,所以不考虑符号位,低位补0即可;右移操作会涉及到符号位出现缺位的问题,所以在有符号数的右移操作时要考虑符号位怎么补的问题。
左移操作(<<)对于无符号数和有符号数来讲,均为逻辑左移操作,对应汇编中的shl;
右移操作(>>)对于无符号数来讲为逻辑右移,对应汇编中的shr,对于有符号数来讲为算数右移,对应汇编中的sar。
对于VC编译器编出来的代码,移位操作的位数保存在cl寄存器。
当移动的位数大于或等于该数据类型位数时,CPU对移动的位数进行基于数据类型位数的取余运算,余数为实际移动的位数。比如uint32_t类型左移32位,实际移动0位,也就是数字保持不变;左移33位,则实际左移1位。
逻辑左移时,高位补0;逻辑右移时,低位补0。
算数右移时,最高的符号位在每移动一位时都会自动补为原来的值。举例来讲的话,比如int32_t类型的0x80000000,右移1位的话变成0xC0000000,右移31位变成0xFFFFFFFF,也就是说任何int32_t类型的负数在右移31位后都会变成0xFFFFFFFF(符号位的复制),任何int32_t类型的正数在右移31位后都会变成0(相当于逻辑右移)。
因为浮点数的特殊编码方式,浮点数的移位操作基本没啥意义。
在汇编层面,移位操作要比乘除法的操作效率高,不过对于现代编译器而言,已经具备了对于C中乘除法的指令级优化功能。
对于正整数,在不产生溢出的情况下,左移n(n>=1)位的效果为:×(2的(类型位数%n)次幂);右移n(n>=1)位的效果:÷(2的(类型位数%n)次幂),只保留结果的整数部分。
C基础之移位操作的更多相关文章
- java基础语法要点<一>(基于1.8)
http://yishouce.com/java/run http://www.shucunwang.com/RunCode/java/ 数据类型 8种基本数据类型及对应的 类型封装器 byte, s ...
- Python基础教程【读书笔记】 - 2016/7/31
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第十波:第10章 充电时刻 Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装包括 ...
- PHP基础语法随记
PHP常量: 预定义常量: PHP自身也定义了大量的预定义常量,可以使用get_defined_constants()来查看,比较常用的预定义常量有: PHP_OS:PHP系统. PHP_VERSIO ...
- 剑指Offer——知识点储备-Java基础
剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...
- Java基础系列--基础排序算法
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9082138.html 一.概述 基础排序算法包括:桶排序.冒泡排序.选择排序.插入排序等 ...
- C++:位操作基础篇之位操作全面总结
位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识.提高篇则针对各大IT公司如微软.腾讯.百度.360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目 ...
- 【Java初探02】——Java语言基础
本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...
- Java基础1,入门基础知识
本文知识点(目录): 1.java简介 2.环境的搭建 3.关键字 4.标识符 5.注释 6.常量 7.进制的转换 8.变量 9.数据类型的转换 ...
- python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...
随机推荐
- EasyUI-EasyUI框架入门学习
前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给了我.在进行开发之前,需要我这菜鸟对EasyUI框架进行一些基础的 ...
- 格式化Curl返回的Json字符
格式化Curl返回的Json字符 学习了:https://blog.csdn.net/guijiaoba/article/details/78235523 , 使用python工具 curl xxx ...
- 【java web】--css+div总结
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- Install certificates needed for Visual Studio offline installation
Visual Studio is primarily designed for installation from an internet-connected machine, since many ...
- crypto AES 加密 解密
1.aes加密解密说明 https://juejin.im/entry/59eea48e6fb9a0451968c25f aes是对称加密算法 md5是摘要算法,不算是加密,主要用来对信息一致性和完整 ...
- [Swift A]-问号&感叹号
1.必须赋值的变量,或普通变量 var month:Int println("month:\(month)") 上面这2句代码会提示报错,因为没有赋值 2.再看看如下写法 var ...
- 娓娓道来c指针 (4)解析c的声明语句
(4)解析c的声明语句 在继续探索c指针之前.有必要来解析下c语言中复杂的声明语法. 仅仅须要记住两则:一个原则,一个规则. 原则:先看标示符. 规则:运算符优先级是规则. 举例说明 1.最简单的 i ...
- ASP.NET配置文件machine.config与性能[转]
转 http://www.cnblogs.com/chenlulouis/archive/2010/05/26/1744261.html http://www.cnblogs.com/zhangron ...
- 虚拟机运行Linux提示【此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。】的问题
虚拟机运行Linux提示[此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态.]的问题 换了台新笔记本,安装了虚拟机,导入以前的Linux系统镜像,出问题了. 提示以下错误信息: ...
- EMQ ---客户端clientid为空,emq会随机帮忙生成
mqtt v3.1.1协议有规定clientid可以为空,所以当客户端clientid为空,emq会随机帮忙生成. 如果clientid为空,随机生成clientid.例如'emqttd_105789 ...