当前位置:网站首页>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;
}
/* 输出:
*/
边栏推荐
猜你喜欢
[HarekazeCTF2019]Avatar Uploader 1
实现web实时消息推送的7种方案
Oracle动态监听与静态监听详解
Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions
.NET 6.0中使用Identity框架实现JWT身份认证与授权
Is it reliable to work full-time in self-media?
MySQL详细学习教程(建议收藏)
SLIM: Sparse Linear Methods (TopN推荐)
理解实现搜索二叉树
Navisworks切换语言
随机推荐
fast shell porting
LeetCode167: Sum of two numbers in sorted array
Dive deep on Netflix‘s recommender system(Netflix推荐系统是如何实现的?)
Daily practice------Generate 13-digit bar, Ean-13 code rule: The thirteenth digit is the check code obtained by the calculation of the first twelve digits.
Express框架连接MySQL及ORM框架
第六章:决胜秋招
华为云数据治理生产线DataArts,让“数据‘慧’说话”
获得抖音商品详情 API
What does a good resume look like in the eyes of a big factory interviewer?
主流的深度学习推理架构有哪些呢?
matlab simulink锂离子电池智能充电策略研究
关于内和调试无法查看ntdll内存的问题
olap——入门ClickHouse
MySQL索引常见面试题(2022版)
Redis缓存穿透-热点缓存并发重建-缓存与数据库双写不一致-缓存雪崩
leetcode:1488. 避免洪水泛滥【二分 + 贪心】
实现web实时消息推送的7种方案
Promise入门到精通(1.5w字详解)
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
Error occurred while trying to proxy request项目突然起不来了