美文网首页
【Java】使用位运算(&)代替取模运算(%)

【Java】使用位运算(&)代替取模运算(%)

作者: 一点点2018 | 来源:发表于2019-12-01 23:03 被阅读0次

本文转载自:http://www.ciphermagic.cn/use-and-to-module.html,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

位运算(&)效率要比取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

a % b == a & (b - 1)

前提:b 为 2^n

来源自 HashMap 中的 indexFor 方法:

static int indexFor(int h, int length){
   return h & (length-1);
}

这个方法是使用哈希值对链表数组的长度取模,得到值所在的索引位置,里面使用位运算(&)代替普通的(%)运算。

原理

具体的效率对比这里不赘述,简单说一下为什么 & 可以代替 %

X % 2^n = X & (2^n - 1)

2^n 表示 2 的 n 次方,也就是说, 一个数对 2^n 取模相当于一个数和 (2^n - 1) 做按位与运算 。

假设 n 为 3,则 2^3 = 8,表示成 2 进制就是 1000。2^3 - 1 = 7 ,即 0111。

此时 X & (2^3 - 1) 就相当于取 X 的 2 进制的最后三位数。

从 2 进制角度来看,X / 8 相当于 X >> 3,即把 X 右移 3 位,此时得到了 X / 8 的商,而被移掉的部分(后三位),则是 X % 8,也就是余数。

推广到一般:

对于所有 2^n 的数,二进制表示为:

1000…000,1 后面跟 n 个 0

而 2^n - 1 的二进制为:

0111…111,0 后面跟 n 个 1

X / 2^n 是 X >> n,那么 X & (2^n - 1) 就是取被移掉的后 n 位,也就是 X % 2^n。

相关文章

  • 【Java】使用位运算(&)代替取模运算(%)

    本文转载自:http://www.ciphermagic.cn/use-and-to-module.html,本站...

  • hashMap的一些问题

    hashMap的大小为什么是2的次方数? 采用按位与运算(&)代替取模运算(&),当 b = 2^n 时,a %...

  • Java的运算符

    Java有4大类运算符:算术运算、位运算、关系运算和逻辑运算。 运算符的优先级 模运算符 Java中,模运算符不止...

  • Java基础知识3

    Java基础知识3 运算符 Java语言支持如下运算符 算术运算符:+,-,*,/,%模,取余数,++,-- 赋值...

  • 位运算应用

    取模 由于偶数的最低位为 0,奇数为 1,所以取模运算可以用位操作来代替。 取整 位掩码 通过定义这些选项,可以用...

  • 编程小技巧

    在乘 0.5 时,使用右移一位,效率最高,在乘 2 时,使用左移一位效率最高 在对 2 取模运算时,可以使用与运算...

  • java 中的除法与取余

    一、取余?取模? 首先区别一下取模运算(Modulo Operation)和取余运算(Complementatio...

  • 3. 运算符

    取模% 幂运算2**12 除运算10/3只取整数部分10//3 比较运算 赋值运算 =+=-= 逻辑运算 从左往右...

  • 《Java编程的逻辑笔记3》--基本运算

    算术运算 算术运算符有加减乘除,符号分别是+-*/,另外还有取模运算符%,以及自增(++)和自减(–)运算符。取模...

  • 运算符

    算术运算符 > +-*/ + 号遵循从左到右,可作为运算加号和连接符使用% 取模即取余数a++ 后加加...

网友评论

      本文标题:【Java】使用位运算(&)代替取模运算(%)

      本文链接:https://www.haomeiwen.com/subject/cjgtgctx.html