当前位置:网站首页>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;
}
/* 输出:

*/
边栏推荐
猜你喜欢
随机推荐
从零开始的Multi-armed Bandit
mysql进制安装与mysql密码破解
Insert data into MySQL in C language
What does a good resume look like in the eyes of a big factory interviewer?
The first time I used debug query and found that this was empty, does it mean that the database has not been obtained yet?please help.
全职做自媒体靠谱吗?
向量检索基础方法总结
阿里SIM-基于检索的用户行为兴趣CTR模型(Search-based user Interest Model(SIM))
(18)[系统调用]追踪系统调用(服务表)
万华化学精细化工创新产品大会
获得抖音商品详情 API
Security business revenue growth rate exceeds 70% 360 builds digital security leader
SLIM: Sparse Linear Methods (TopN推荐)
数据库课程设计大作业大盘点【建议在校生收藏】
京东获取推荐商品列表 API
升级Win11后不喜欢怎么退回Win10系统?
Login Module Debugging - Getting Started with Software Debugging
592. Fraction Addition and Subtraction
[MRCTF2020]Ezaudit
.NET 6.0中使用Identity框架实现JWT身份认证与授权









