当前位置:网站首页>C陷阱与缺陷 第7章 可移植性缺陷 7.5 移位运算符
C陷阱与缺陷 第7章 可移植性缺陷 7.5 移位运算符
2022-07-30 17:10:00 【weixin_客子光阴】
移位运算符
在向右移位时,空出的位由0填充,还是由符号位的副本填充?
如果被移位的对象是无符号数,那么空出的位将被0填充。如果被移位的对象是有符号数,那么既可以空出的位都用0或者1填充,取决于C语言的实现。
移位计数(即移位操作的位数)允许的取值范围是什么?
如果被移位的对象长度为n位,那么移位计数必须大于或等于0,而严格小于n。因此,不可能做到在单次操作中将某个数的所有位都移出。因为只要加上这个限制,我们就能够在硬件上高效地实现移位运算。
即使C实现将符号位复制到空出的位中,有符号整数的向右移位运算并不等同于除以2的某次幂。要证明这一点,让我们考虑(-1)>>1,这个操作的结果一般不可能为0,但是(-1)/2在大多数C实现中的求值结果都是0。这意味着以除法运算来代替移位运算,将可能导致程序运行速度大大减慢。
low + high为非负,那么
mid = (low + high) >> 1;
mid = (low + high) / 2;
完全等效,而且前者的执行速度也要快很多。
#include<stdio.h>
int main()
{
printf("(-1)>>1 = %d, (-1)/2 = %d\n", (-1)>>1, (-1)/2);
return 0;
}
/* 输出:

*/
边栏推荐
猜你喜欢
随机推荐
Insert data into MySQL in C language
报错500,“message“: “nested exception is org.apache.ibatis.binding.BindingException: 解决记录
Research on intelligent charging strategy of matlab simulink lithium-ion battery
Discuz杂志/新闻报道模板(jeavi_line)UTF8-GBK模板
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
阿里巴巴CAN:Embedding前置的特征交互新思路
Paper reading (63): Get To The Point: Summarization with Pointer-Generator Networks
基于stm32的shell实现
Wanhua chemical fine chemical industry innovation product assembly
MySQL详细学习教程(建议收藏)
论文阅读之《Color Constancy Using CNNs》
Oracle动态监听与静态监听详解
Dive deep on Netflix‘s recommender system(Netflix推荐系统是如何实现的?)
阿里巴巴中国站获得1688商品分类 API
优酷视频元素内容召回系统:多级多模态引擎探索
Mongoose模块
Tensorflow中实现正则化
线程同步 控制执行顺序
onenote使用
[MRCTF2020]Ezaudit









