【基础】位与运算与取余
关于位与运算&与取余
今天在研究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
【基础】位与运算与取余相关推荐
- C语言取模运算(取余运算)
C语言取模运算(取余运算) 取模算法: 取余(取模)的奥义 C语言运用 取模算法: 取模运算也叫取余运算,在C中用%来表示, 数学中叫mod. x mod y = x%y x%y = x - y[x/ ...
- 编写整除运算程序JAVA_编写一程序把变量n的初始值设置为5814然后利用除法运算和取余.DOC...
编写一程序把变量n的初始值设置为5814然后利用除法运算和取余 <电子商务应用开发技术>实验指导书 一.下载,安装 JDK(Java Development Kit )是一切java应用程 ...
- Python 取模运算(取余)%误区及详解
Python 取模运算(取余)%误区及详解 首先,必须要先明确一个概念(针对新手),不要用数学求余数角度来思考模运算,python.Java等各种语言都有其不同的运行机制. python的模运算计算规 ...
- c语言里取余数的运算的代码,Math——取模运算及取余运算(示例代码)
取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b ...
- mysql取余 和 取模_java 取模运算% 实则取余 简述 例子 应用在数据库分库分表
java 取模运算% 实则取余 简述 例子 应用在数据库分库分表 求模运算与求余运算不同."模"是"Mod"的音译,模运算多应用于程序编写中. Mod的含义为 ...
- 与运算和取余运算的配对条件
偶然在一个算法解析中,看到作者用与运算来代替取余运算,感觉属实有点装逼,于是有了钻研一下的想法. 首先通过实验来看看,与运算和取余运算存在一个怎样的关系. for i in range(100 ...
- python模运算求余_取模运算和取余运算
取模运算和取余运算 取模运算( " Modulo Operation " )和取余运算 ( " Complementation " )两个概念有重叠的部分但又不 ...
- 取模运算和取余运算的区别
先说结论:取模和取余在计算的目标上是一致的,只是商的不同,导致结果不同,取余和取模在被除数.除数同号时,结果是等同的,异号时会有区别. 那么 Why? 取模,取余是怎样计算的 在计算机中,对于整型数a ...
- 模运算与取余运算的区别
模运算与求余 首先,"模运算"与"求余运算"都是求取除法中产生的"余数".比如 "7÷3"产生的余数就是1,所以无论对7 ...
- C++中取余运算的优化
0.前言 gcc/g++编译优化选项:-O 这个选项控制所有的优化等级.使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候. -O设置一共有五种:-O0.-O1.- ...
最新文章
- AutoShape:实时单目3D检测网络(ICCV2021)
- python接口自动化测试(三)-requests.post()
- Linux用户环境变量
- java sqlite mybatis_Spring boot + Mybatis + SQLite 搭建blog API
- Java 中引用类型
- TCP三次握手四次挥手 TCP/UDP区别
- Linux启动/停止/重启Mysql数据库的方法
- 初学java之常用组件
- 增加 processon 免费文件数
- (转)淘淘商城系列——商品搜索功能表现层实现
- 《人工智能》实验二——搜索技术(八数码问题)
- 像A + B一样容易
- 怎么从视频文件中提取音频?
- codeigniter CI 框架 在helper 中 使用 全局变量 方法
- 中国能源物联网行业运营格局及供需态势分析报告2022-2028年版
- oracle视图、函数、循环、case when
- 计算机考研作息时间表,2020考研的最佳作息时间表 如何安排学习时间
- Linux内核和传统Unix内核的比较
- 工信部定级备案和等保备案有什么区别
- 51cto的火星语。
热门文章
- vim插件ctags的安装和使用
- Entity Framework 6 执行Linq to Entities异常p__linq__1 : String truncation: max=0, len=2, value='测试'...
- Flex 页面空白或Error #2032: 流错误处理办法
- 基于.net技术的 Rss 订阅开发
- 【文本匹配】cqrctr:文本匹配的破城长矛
- 中心极限定理通俗介绍
- 每日算法系列【LeetCode 495】提莫攻击
- Linux基础—1.Linux系统(CentOS6.7)详细安装过程
- 1.4 案例:广告预测、房价预测
- torchtext用法