文档章节

教你理解位移

思想永无止境
 思想永无止境
发布于 2016/11/04 11:58
字数 495
阅读 1
收藏 0

一个很简单问题:用什么方式计算2*8最高效?
没错答案,就是2<<3,你肯定也是知道答案的。
但为什么是2<<3不是2<<2也不是2<<4呢?
估计有不少人就发懵了。
以下就来讲解一下位运算中的左移右移。
先看一下在10进制中对数字进行左右移操作:
目标数字:1
左移1位:10
左移2位:100
右移1位:0.1
右移2位:0.01
很明显,一个10进制的数左移多少位就乘以10的多少次方,右移多少位就除以10的多少次方。
再看一下2进制中对数字进行左右移操作:
目标数字:1
左移1位:10
左移2位:100
右移1位:0.1
右移2位:0.01
看到没有,其实是和10进制是一样的,只不过同样的位移因为不同的进制导致数值的不同。
很明显,一个2进制的数左移多少位就乘以2的多少次方,右移多少位就除以2的多少次方。

根据以上规律可得出:
在r进制中,一个数a左移b位,就等于a乘以r的b次方,公式:a << b=a*(r^b)。
在r进制中,一个数a乘以另一个数b,等于a左移b开r方根的次数(以r为底的b的对数 ),公式:a*b=a<< log r(b)。

在r进制中,一个数a右移b位,就等于a除以r的b次方,公式:a >> b=a/(r^b)。
在r进制中,一个数a除以另一个数b,等于a右移b开r方根的次数(以r为底的b的对数 ),公式:a/b=a>>log r(b)。

现在请看2*8,因为a * b=a<< log r(b),所以2乘以8等于2左移3(3=8开2次方根的次数,以2为底的8的对数)。

© 著作权归作者所有

思想永无止境
粉丝 4
博文 257
码字总数 292814
作品 0
昌平
程序员
私信 提问
JS操控CSS样式完成小球自由落体运动,和大家分享一下制作心得。

这篇心得本应该在一个月之前和大家一起分享的,由于本人比较懒,也几乎没有写博客的习惯,所以迟了一些。有一些内容只是一些个人的废话,可看可不看,毕竟在国内的应试教育下,大家基础物理知...

GPG_gogo
2013/07/17
0
0
理解欧拉公式,其实也没那么难。

最近看了3brown1blue的视频,通过集合论的方式来理解欧拉公式。 传送门:翻墙观看 欧拉公式的一种形式: 欧拉公式的难点是理解乘方是复数的意义,它并不是和1+1=2一样让人觉得理所应当,而是...

Stansosleepy
2017/05/01
0
0
手把手教你制作无缝拼贴图案

讲真,作为一个真·直男,看见各种卡通无缝拼贴图案的时候还是无法自拔...比如我们上Pattern Library看看啊~ 虽然现在很多网站提供开源的无缝拼贴图案(Pattern Library也是),但是始终没自...

AX阿祥
2017/12/09
0
0
递归算法之不用乘号的乘法——用位移实现乘法(dart语言实现)

  前两天突发奇想,写一个乘法的实现,但不用乘号*。并测试一下性能如何。因此就有了下面的代码:(本文主要目的是为了玩递归和位移,因此仅限自然数) 首先,标准乘法: 1 int commonMult...

Burkut
05/10
0
0
Masonry 约束Scrollview问题

问题描述 开发中遇到了关于Masonry对于Scrollview的contentSize的设置问题。通过阅读Masonry的源码,我最终找到了我想要的方法。 其实问题很简单,也因为我个人对于Masonry使用还不够熟练(平...

w_sen
2016/08/01
85
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty源码学习(一)--导入IDEA并编译

1.从github下载最新的Netty稳定版本源码 2.解压源码文件夹 3.导入IDEA 4.跳过checkstyle和xml validate <plugin> <artifactId>maven-checkstyle-plugin</artifactId> <version>2.12.......

湖之风情
26分钟前
2
0
电商网站用户端FE

需求拆分原则 1、单个迭代不宜太大 2、需求可交付,能够形成功能闭环 3、有成本意识,遵循二八原则 4、有预期的价值体现 提炼核心需求 用户端:商品、购物车、下单、支付、订单、用户 后台管...

星闪海洋
37分钟前
1
0
Awesome Blockchain 区块链技术导航

区块链技术导航:收集整理最全面最优质的区块链(BlockChain)技术开发相关资源。 以后找不到文档资料的时候去导航站看看。 先亮个像,我长这样: 导航站内容 区块链开发所涉及的资源: 如 项目...

Tiny熊
41分钟前
1
0
聊聊我的第一篇10万+,同时反驳某些评论

元旦的时候,我立了一个Flag,今年要写一篇10万+,现在目标算是完成一半了。 终于有了一篇10万+ 知乎后台显示我的回答《如何衡量一个人的 JavaScript 水平?》的阅读量已经超过了10万,具体截...

Fundebug
47分钟前
5
0
ping的用法

ping的用法: -t ping指定的主机,直到停止。若要查看统计信息并继续操作-请键入 Control-Break; 若要停止-请键入Control-C。 -a 将地址解析成主机名。 -n count 要发送的回显请求数。 -l s...

WinkJie
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部