Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种高效的求余数的办法,但其中的原理是什么呢为什么可以这么做呢?

先上结论:假设被除数是x,对于除数是2n的取余操作x%2n,都可以写成x&(2n-1),位运算效率高!

eg:%=&=

&==

网上对这个原因的解释都是模糊不清,下面是我对于这个等式为什么成立的一些理解。

就拿上面这个259%8进行举例。

259的二进制为100000011,8的二进制为1000。

假如对8进行取余,那么只需要留下最后4位,前面的都可以舍弃,为什么呢?

因为比8更高位的都来自于8的2次幂,所以高位的1都是可以整除8,可以直接舍弃。

这解释了为什么只有除数是2n才可以这样的操作,因为如果除数是9的话,高位不一定能整除9,无法舍弃所以不行。(其余2n除数也同理)

也解释了为什么位数不同也可以做&操作,因为比除数高的位都是可以舍弃的。

然后就是&操作了,直接&8的话是不行的,假设最后四位是1XXX,那么1XXX&1000=1000,很明显对8取余得到的结果不可能是8,余数应在0到除数减一之间,

所以我们需要对&7,让取余结果最大在0-7之间。

这就解释了为什么要&(2n-1)。

那有些人会问了,那我就是要&8,不就是相当于对9取余吗?

对9取余就违反了上面的:“只有除数是2n才可以这样的操作”

以上是个人对这个取余原理的理解,欢迎讨论

高效取余运算(n-1)&hash原理探讨的更多相关文章

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

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

  2. 使用 & 进行高效率取余运算

    Java的HashMap源码中用到的(n-1)&hash这样的运算,这是一种高效的求余数的方法 结论:假设被除数是x,对于除数是2n的取余操作x%2n,都可以写成x&(2n-1),位运 ...

  3. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  4. 洛谷P1226 【模板】快速幂||取余运算

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...

  5. LuoguP1226 【模板】快速幂||取余运算

    题目链接:https://www.luogu.org/problemnew/show/P1226 第一次学快速幂,将别人对快速幂原理的解释简要概括一下: 计算a^b时,直接乘的话计算次数为b,而快速幂 ...

  6. php取余运算(%) 注意事项

    <?php //php取余运算(%)的那点事,php取余数用%符号,即为模运算 //理论上应该输出45才对,可是实际运算结果是44 $val=9.45; $result=$val*100; ec ...

  7. 快速幂 cojs 1130. 取余运算

    cojs 1130. 取余运算 ★   输入文件:dmod.in   输出文件:dmod.out   简单对比时间限制:10 s   内存限制:128 MB [题目描述] 输入b,p,k的值,求b^p ...

  8. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...

  9. python 取余运算

    python中取余运算逻辑如下: 如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系: a = qd + r , q 为整数,且0 ≤ |r| < |d|. 经过测试可发现,pytho ...

随机推荐

  1. Mysql的旧版本下载地址

    直接进入:http://downloads.mysql.com/archives/community/

  2. 巧妙利用label标签实现input file上传文件自定义样式

    提到上传文件,一般会想到用input file属性来实现,简单便捷,一行代码即可    但input file原生提供的默认样式大多情况下都不符合需求,且在不同浏览器上呈现的样式也不尽相同   我们往 ...

  3. 彻底理解volatile,领悟其中奥妙

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  4. 四步解决linux上sublime无法输入中文的问题

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...

  5. python爬取网业信息案例

    需求:爬取网站上的公司信息 代码如下: import json import os import shutil import requests import re import time reques ...

  6. flex下省略号的问题解决

    最近在搞微信小程序,发现flex下使用省略号是没有效果的,而且还会打乱预期的结构,查询statckoverflow知道需要在父级设置min-width:0; 但是在我的尝试下,依然不行,原来在上层父级 ...

  7. HTML中特殊符号编码对照表,html特殊符号编码都有哪些?

    HTML中一些无法打出来的符号可以用相应的代码进行代替显示,本文提供了一些HTML特殊符号相应的代码供开发者参考. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 ...

  8. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...

  9. 示例:Oracle表锁、行锁模拟和处理

    for update模拟锁表 --session 1 SQL> select * from tt for update; --session 2 SQL> update tt set id ...

  10. 失败的一天(找bug)

    前天早上来到实验室,准备抓紧时间写写代码,毕竟第二天就是组会了.点了一下鼠标,发现显示屏无法唤醒,然后就准备强制关机再开机(我一般不关机,以前遇到过几次无法唤醒),低头发现主机不亮,然后按了开关也不亮 ...