与运算和取余运算的配对条件
偶然在一个算法解析中,看到作者用与运算来代替取余运算,感觉属实有点装逼,于是有了钻研一下的想法。
首先通过实验来看看,与运算和取余运算存在一个怎样的关系。
for i in range(100, 110):print(i, bin(i),i&1, i%2)
#结果
100 0b1100100 0 0
101 0b1100101 1 1
102 0b1100110 0 0
103 0b1100111 1 1
104 0b1101000 0 0
105 0b1101001 1 1
106 0b1101010 0 0
107 0b1101011 1 1
108 0b1101100 0 0
109 0b1101101 1 1for i in range(100, 110):print(i, bin(i),i&2, i%3)
#结果
100 0b1100100 0 1
101 0b1100101 0 2
102 0b1100110 2 0
103 0b1100111 2 1
104 0b1101000 0 2
105 0b1101001 0 0
106 0b1101010 2 1
107 0b1101011 2 2
108 0b1101100 0 0
109 0b1101101 0 1for i in range(100, 110):print(i, bin(i),i&3, i%4)
#结果
100 0b1100100 0 0
101 0b1100101 1 1
102 0b1100110 2 2
103 0b1100111 3 3
104 0b1101000 0 0
105 0b1101001 1 1
106 0b1101010 2 2
107 0b1101011 3 3
108 0b1101100 0 0
109 0b1101101 1 1for i in range(100, 110):print(i, bin(i),i&4, i%5)
#结果
100 0b1100100 4 0
101 0b1100101 4 1
102 0b1100110 4 2
103 0b1100111 4 3
104 0b1101000 0 4
105 0b1101001 0 0
106 0b1101010 0 1
107 0b1101011 0 2
108 0b1101100 4 3
109 0b1101101 4 4for i in range(100, 110):print(i, bin(i),i&5, i%6)
#结果
100 0b1100100 4 4
101 0b1100101 5 5
102 0b1100110 4 0
103 0b1100111 5 1
104 0b1101000 0 2
105 0b1101001 1 3
106 0b1101010 0 4
107 0b1101011 1 5
108 0b1101100 4 0
109 0b1101101 5 1
可以看到从2到6中,与运算和取余运算相等情况有:2取余和1与运算,4取余和3与运算。所以我们不妨大胆的做个假设:
- 存在正整数n,如果n与2是幂关系,那么对n求余等价于对(n-1)进行与运算。
大家可以多用代码跑一跑, 在实验中可以证实其真实性,但是理论上是为什么呢? - 其实很简单,主要分为两点:
- 假如m对n求余,那么这个余数肯定小于n,也就是最大为n-1;
- 举个具体的例子,将m表示为1100100(100),n表示为100(4),那么100可以换算成1*26+1*25+1*22=100,对100取余等价于对100%4=1*26%4+1*25%4+1*22%4,可以很简单的发现,对于1100100(100),只要比100(4)更高的位一定可以被4整除,所以关键就在于剩下的位,在本例中,4有3位,所以只看后3位就行,也就是100;
- 问题就来了,为什么100对011(3)进行与运算,就等于对4取余呢?其实答案到这里已经呼之欲出了,取余就是从100中每次取4份,最后剩下的,也就是算3(n-1)对应位的二进制值,本例中为00,这就是分完剩下的。说白了,与3与运算就是为了算最后两位对应的值。
最后我们来看看,有逼格的与运算是否在运算速度上会远远快于取余运算。
- 本例对[100, 108),共计99999900分别进行与运算和取余运算,结果如下:
#取余运算
import time
start_time = time.time()
for n in range(100, 10**8):temp = n % 4
print("耗时:", time.time()-start_time)# 结果
耗时: 4.623804330825806#与运算
start_time = time.time()
for n in range(100, 10**8):temp = n & 3
print("耗时:", time.time()-start_time)
耗时: 6.289257049560547
额,这是不是就尴尬了,与运算怎么逼格高了一些,运算速度反而不如取余运算,然而我用python来算事实就是如此,具体是不是python优化了取余运算我就不得而知了。
与运算和取余运算的配对条件相关推荐
- c语言里取余数的运算的代码,Math——取模运算及取余运算(示例代码)
取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b ...
- python模运算求余_取模运算和取余运算
取模运算和取余运算 取模运算( " Modulo Operation " )和取余运算 ( " Complementation " )两个概念有重叠的部分但又不 ...
- C语言取模运算(取余运算)
C语言取模运算(取余运算) 取模算法: 取余(取模)的奥义 C语言运用 取模算法: 取模运算也叫取余运算,在C中用%来表示, 数学中叫mod. x mod y = x%y x%y = x - y[x/ ...
- 取模运算和取余运算的区别
先说结论:取模和取余在计算的目标上是一致的,只是商的不同,导致结果不同,取余和取模在被除数.除数同号时,结果是等同的,异号时会有区别. 那么 Why? 取模,取余是怎样计算的 在计算机中,对于整型数a ...
- 模运算与取余运算的区别
模运算与求余 首先,"模运算"与"求余运算"都是求取除法中产生的"余数".比如 "7÷3"产生的余数就是1,所以无论对7 ...
- java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...
- java取余位运算_java学习--高效的除模取余运算(n-1)hash
没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...
- 编写整除运算程序JAVA_编写一程序把变量n的初始值设置为5814然后利用除法运算和取余.DOC...
编写一程序把变量n的初始值设置为5814然后利用除法运算和取余 <电子商务应用开发技术>实验指导书 一.下载,安装 JDK(Java Development Kit )是一切java应用程 ...
- 取余运算 C和python的区别
今天看书发现python与C的负数取余运算结果不同,查资料理解. 取余运算的算法是相同的 r = a- n*(a/n) n!=0 r是余数,a是被除数,n是除数.n不能为0,否则都会报错. 负数 ...
最新文章
- 发动机异响故障诊断与排除_发动机缺缸故障诊断以及排除方法
- git 常用命令使用
- 一些powershell基本使用示例
- 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
- IOS -- UICollectionView里面的cell点击,点击一个cell改变其他cell的状态
- r语言主成分分析_PCA主成分分析
- Ubuntu下安装JDK1.8并配置开发环境
- 【变色龙】app封装系统源码+完美版在售封装系统
- js创建对象之原型模式2原型与in操作符
- T4生成实体,单张表和多张表
- [AndroidO] [RK3399] -- CH341驱动移植
- 新手CrossApp 之demo SecondViewController小结
- 用友NC总账辅助余额表与应收应付模块余额表对账技巧
- 微信备份时提示不在同一个网络
- 新锐领袖之力——中国时尚达人李磊受邀参加balmain 2022秋冬大秀
- android开发 之 Canvas绘制文字,图片
- Android获取AP热点IP,获取连接到本机AP热点设备的IP地址
- 个人理财必须掌握的10个技巧
- 关于HANA的schame
- PHP实现平台商品和京东价格做对比
热门文章
- web前端期末大作业 在线电影网页设计与制作 HTML+CSS+JavaScript仿叮当电影网页制作
- zedboard 8路拨码开关
- SSHFS 映射远程目录 | Ubuntu18.04把远程目录的文件当做本地的用
- 用Java将doc文档转成pdf格式
- 房子装修工程师CSS(一)之盒子模型/选择器的权重计算/常见样式属性/浮动float
- 9月编程排行榜新鲜出炉!霸榜还得是它!
- 以太坊椭圆曲线数字签名
- 阿迪达斯大中华区2019年第三季度销售额再录得双位数增长
- 爱因斯坦的阶梯 java,爱因斯坦阶梯
- 发票查验API 发票管理自动化