偶然在一个算法解析中,看到作者用与运算来代替取余运算,感觉属实有点装逼,于是有了钻研一下的想法。
  首先通过实验来看看,与运算和取余运算存在一个怎样的关系。

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)进行与运算。
      大家可以多用代码跑一跑, 在实验中可以证实其真实性,但是理论上是为什么呢?
  • 其实很简单,主要分为两点:
  1. 假如m对n求余,那么这个余数肯定小于n,也就是最大为n-1;
  2. 举个具体的例子,将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;
  3. 问题就来了,为什么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优化了取余运算我就不得而知了。

与运算和取余运算的配对条件相关推荐

  1. c语言里取余数的运算的代码,Math——取模运算及取余运算(示例代码)

    取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b ...

  2. python模运算求余_取模运算和取余运算

    取模运算和取余运算 取模运算( " Modulo Operation " )和取余运算 ( " Complementation " )两个概念有重叠的部分但又不 ...

  3. C语言取模运算(取余运算)

    C语言取模运算(取余运算) 取模算法: 取余(取模)的奥义 C语言运用 取模算法: 取模运算也叫取余运算,在C中用%来表示, 数学中叫mod. x mod y = x%y x%y = x - y[x/ ...

  4. 取模运算和取余运算的区别

    先说结论:取模和取余在计算的目标上是一致的,只是商的不同,导致结果不同,取余和取模在被除数.除数同号时,结果是等同的,异号时会有区别. 那么 Why? 取模,取余是怎样计算的 在计算机中,对于整型数a ...

  5. 模运算与取余运算的区别

    模运算与求余 首先,"模运算"与"求余运算"都是求取除法中产生的"余数".比如 "7÷3"产生的余数就是1,所以无论对7 ...

  6. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

  7. java取余位运算_java学习--高效的除模取余运算(n-1)hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...

  8. 编写整除运算程序JAVA_编写一程序把变量n的初始值设置为5814然后利用除法运算和取余.DOC...

    编写一程序把变量n的初始值设置为5814然后利用除法运算和取余 <电子商务应用开发技术>实验指导书 一.下载,安装 JDK(Java Development Kit )是一切java应用程 ...

  9. 取余运算 C和python的区别

    今天看书发现python与C的负数取余运算结果不同,查资料理解. 取余运算的算法是相同的  r = a- n*(a/n)   n!=0 r是余数,a是被除数,n是除数.n不能为0,否则都会报错. 负数 ...

最新文章

  1. 发动机异响故障诊断与排除_发动机缺缸故障诊断以及排除方法
  2. git 常用命令使用
  3. 一些powershell基本使用示例
  4. 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
  5. IOS -- UICollectionView里面的cell点击,点击一个cell改变其他cell的状态
  6. r语言主成分分析_PCA主成分分析
  7. Ubuntu下安装JDK1.8并配置开发环境
  8. 【变色龙】app封装系统源码+完美版在售封装系统
  9. js创建对象之原型模式2原型与in操作符
  10. T4生成实体,单张表和多张表
  11. [AndroidO] [RK3399] -- CH341驱动移植
  12. 新手CrossApp 之demo SecondViewController小结
  13. 用友NC总账辅助余额表与应收应付模块余额表对账技巧
  14. 微信备份时提示不在同一个网络
  15. 新锐领袖之力——中国时尚达人李磊受邀参加balmain 2022秋冬大秀
  16. android开发 之 Canvas绘制文字,图片
  17. Android获取AP热点IP,获取连接到本机AP热点设备的IP地址
  18. 个人理财必须掌握的10个技巧
  19. 关于HANA的schame
  20. PHP实现平台商品和京东价格做对比

热门文章

  1. web前端期末大作业 在线电影网页设计与制作 HTML+CSS+JavaScript仿叮当电影网页制作
  2. zedboard 8路拨码开关
  3. SSHFS 映射远程目录 | Ubuntu18.04把远程目录的文件当做本地的用
  4. 用Java将doc文档转成pdf格式
  5. 房子装修工程师CSS(一)之盒子模型/选择器的权重计算/常见样式属性/浮动float
  6. 9月编程排行榜新鲜出炉!霸榜还得是它!
  7. 以太坊椭圆曲线数字签名
  8. 阿迪达斯大中华区2019年第三季度销售额再录得双位数增长
  9. 爱因斯坦的阶梯 java,爱因斯坦阶梯
  10. 发票查验API 发票管理自动化