博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速算出移位运算符结果方法
阅读量:6119 次
发布时间:2019-06-21

本文共 780 字,大约阅读时间需要 2 分钟。

在不大于自身数值类型最大位数的移位时,一个数移位n,就是将这个数乘以(左移)2的n次幂,右移就是除,然后都取整就可以了
比如int 32位的
500>>3 这样算:500/8 取整 就是62
356>>4 356/16 结果是 22
8<<3 8*8 结果是 64
64位和上面方法一样。
如果移动过大超过了32位怎么办 移位数和32取余得到的数字在套用上面就可以了
比如 500>>67 怎么算?(就相当于500>>3)
1.先67对32取余 结果是3
2. 然后500/8 结果62
补充一点:计算机指令种的右移位运算符有2种,左移就是补0没花哨。但右移就有点事情了。
1. 算术右移 意思是你移动后补的是最高位的值。
举例:一个byte数字99 的二进制是 0110 0011
你右移4位后 补的是0 ------0000 0110
但是再看这一个:byte数字-107二进制是1001 0101 这是1开头的
你右移4位后补的确是最高位1 -------1111 1001
2.逻辑右移 补0就完事了
针对右移,C语言美显示给出用哪种的,一般根据编译器/机器组合来确定用哪一种,但大多数都默认算术右移。
JAVA就比较严谨了,明确规定x>>k是算术右移
x>>>k是逻辑右移
话说回来之所以区分这一点我想应该是对有符号的规定吧,无符号右移肯定是逻辑的啊 最高位本来就是0,然而对于负数最高位是1,在进行右移时算术右移的提出解决了一个很普遍的问题,那就是负整数的除法运算,你负数除以一个正数一定是负数吧,如果没有算数右移这一概念的提出不补1都补0的话你得到的就是正数了,算术右移可以替代除法运算。有了这个就完美了,得到的还是负数,符合现实中数学常识了

转载于:https://juejin.im/post/5ceaa5dcf265da1bd6058164

你可能感兴趣的文章
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>
while()
查看>>
常用限制input的方法
查看>>
Ext Js简单事件处理和对象作用域
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>