关于位与运算&与取余
今天在研究hashmap源码的时候,发现其源码中在解决Entry分布时,本来大多数人以为会用index = hash % length,但是源码中却使用了index = hash & (lenth -1)的方式。

/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

  

另外由上述还可以注意到,在源码中对于Entry数组容量的定义中,要求容量必须为2的n次幂(或0),于是就搜索查询了一下用意。

原来位与也是可以用来取余的,但是有一个条件:除数必须是2的n次幂才行。举例子来说明:

9%8=1
1001 & (1000 - 1)
=1001 & 0111
=1 // 1001是9的二进制表示,1000是8的二进制表示

其实很明显了,在二进制计算中,众所周知的是,一个数右移1位相当于除以2的商,而恰巧被移除出去的那一位就是除以2得到的余数,例如:

9 >> 1
=1001 >> 1
=100 | 1
=4 余 1

而且,不仅是除以2,对于一个数k要除以2的n次方,也就是相当于把k向右移n位,而被移出去的n位即正好是我们要求是余数。

那么问题就简单了,实际上,对于除数是2的n次方的算式,我们只需要得到被除数的低n位就可以了,而正好,对于2的n次方这样的数,我们将其转换为二进制之后,它就是第n+1位为1,其余低位都为0的数,因此我们将其减1,就得到了第n+1位为0,而其他位都为1的数,用此数与被除数k进行位与运算,就得到了被除数的低n位二进制数,也即是
k%2n的结果。

总结:
若一个数m满足: m=2n

那么k % m = k & (m-1)

转载于:https://www.cnblogs.com/itplay/p/10030292.html

【基础】位与运算与取余相关推荐

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

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

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

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

  3. Python 取模运算(取余)%误区及详解

    Python 取模运算(取余)%误区及详解 首先,必须要先明确一个概念(针对新手),不要用数学求余数角度来思考模运算,python.Java等各种语言都有其不同的运行机制. python的模运算计算规 ...

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

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

  5. mysql取余 和 取模_java 取模运算% 实则取余 简述 例子 应用在数据库分库分表

    java 取模运算%  实则取余 简述 例子 应用在数据库分库分表 求模运算与求余运算不同."模"是"Mod"的音译,模运算多应用于程序编写中. Mod的含义为 ...

  6. 与运算和取余运算的配对条件

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

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

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

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

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

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

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

  10. C++中取余运算的优化

    0.前言 gcc/g++编译优化选项:-O 这个选项控制所有的优化等级.使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候. -O设置一共有五种:-O0.-O1.- ...

最新文章

  1. AutoShape:实时单目3D检测网络(ICCV2021)
  2. python接口自动化测试(三)-requests.post()
  3. Linux用户环境变量
  4. java sqlite mybatis_Spring boot + Mybatis + SQLite 搭建blog API
  5. Java 中引用类型
  6. TCP三次握手四次挥手 TCP/UDP区别
  7. Linux启动/停止/重启Mysql数据库的方法
  8. 初学java之常用组件
  9. 增加 processon 免费文件数
  10. (转)淘淘商城系列——商品搜索功能表现层实现
  11. 《人工智能》实验二——搜索技术(八数码问题)
  12. 像A + B一样容易
  13. 怎么从视频文件中提取音频?
  14. codeigniter CI 框架 在helper 中 使用 全局变量 方法
  15. 中国能源物联网行业运营格局及供需态势分析报告2022-2028年版
  16. oracle视图、函数、循环、case when
  17. 计算机考研作息时间表,2020考研的最佳作息时间表 如何安排学习时间
  18. Linux内核和传统Unix内核的比较
  19. 工信部定级备案和等保备案有什么区别
  20. 51cto的火星语。

热门文章

  1. vim插件ctags的安装和使用
  2. Entity Framework 6 执行Linq to Entities异常p__linq__1 : String truncation: max=0, len=2, value='测试'...
  3. Flex 页面空白或Error #2032: 流错误处理办法
  4. 基于.net技术的 Rss 订阅开发
  5. 【文本匹配】cqrctr:文本匹配的破城长矛
  6. 中心极限定理通俗介绍
  7. 每日算法系列【LeetCode 495】提莫攻击
  8. Linux基础—1.Linux系统(CentOS6.7)详细安装过程
  9. 1.4 案例:广告预测、房价预测
  10. torchtext用法