`
qindongliang1922
  • 浏览: 2191136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117725
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126147
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60078
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71452
社区版块
存档分类
最新评论

使用位运算替代模运算

    博客分类:
  • JAVA
阅读更多


昨天的分析HashMap原理的文章里面提到,使用位运算替代取模运算效率高,但位运算只能在特定场景下才能替代%运算。


正常情况下:
````
a % b = a - (a / b)*b 

````


但如果b的值为2的n次方的时候(n为自然数),这时候就可以用位运算来替代模运算,
转化如下:

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


2的n次方的二进制如下:

````
`
 0001 2^0  1  
 0010 2^1  2
 0100 2^2  4
 1000 2^3  8

````


从上面能看到左移一位是放大2倍,右移一位是缩小2倍


分别减一后的二进制

````

0000 2^0-1 0
0001 2^1-1 1
0011 2^2-1 3
0111 2^3-1 7

````


举例

我们算下11%8的模,

11的二进制是:1011

代入上面的公式:
````
11 % 8 = 11 & (8-1) 
````


7的二进制:   0111


二者做&(与)运算  ,回忆下运算规则:
````
& 与。 全1为1, 有0为0。  任何数与0与都等于0。  
| 或。 有1为1, 全0为0。  任何数与0或都等于原值。
~ 非。 逐位取反
^ 异或。 相同为0,相异为1。 任何数与0异或都等于原值。
````


结果:

1011 & 0111 = 0011

转化成10进制后=3

所以11%8=3



这种方法只是适合于求一个数除以二的N次冥才正确,求模的过程,就是2^n-1的中1的个数就是n的值,再与a做&运算,得出来的低位就是我们期望的余数。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

0
1
分享到:
评论

相关推荐

    位运算及其对程序的优化.pdf

    接着,文章探讨了位运算的实用技巧,如使用位运算替代模运算以提高效率,以及一些特定的位运算技术。 然后,文章展示了位运算如何优化数据结构: 1. **循环队列**:位运算可以简化循环队列的索引计算,减少边界...

    ACM位运算技巧

    7. **取模与乘除法的位运算替代**:在不产生溢出的情况下,可以通过位运算实现取模、乘法和除法操作。 #### 实际应用案例 - **去掉或添加二进制位**:通过右移、左移、按位或与按位与的组合使用,可以灵活地修改二...

    ACM位运算技巧大全.doc(超级详细)

    - **取模运算转换为位运算**:当除数为2的幂时,可以直接使用位运算来替代取模运算。 ```plaintext a % (2^n) 等价于 a & (2^n - 1) ``` - **乘法运算转换为位运算**:当乘数为2的幂时,可以直接使用位运算来...

    运算放大器可以替代比较器吗?

    3. 输入电流问题:在一些运算放大器设计中,例如使用PNP输入晶体管的运算放大器,可能不具备输入钳位,从而允许更大的差动输入电压。但是,这些运算放大器可能在其他方面不具备比较器的性能,例如共模抑制比(CMRR)...

    计算机专业类课程《计算机组成原理》实验报告--8位算术逻辑运算实验.docx

    其中,8位算术逻辑运算实验作为该课程的一个关键实践环节,对于培养学生的实践能力、加深对计算机硬件系统工作原理的理解起到了不可替代的作用。 实验的核心在于熟悉并掌握算术逻辑运算器(ALU)的工作原理。ALU是...

    位运算及其应用实例.docx

    位运算在计算机科学中...总的来说,位运算在编程中虽然不常用,但在特定场景下,如优化代码、处理硬件接口或进行高效计算时,它的价值是无可替代的。学习和理解位运算,有助于提高程序员在低级别编程时的技能和效率。

    C语言英文课件:位运算完美版资料.ppt

    通过本篇对C语言位运算的深入探讨,我们了解到位运算不仅在计算机底层编程中有其不可替代的作用,而且在软件开发的许多方面也发挥着重要的作用。掌握位运算,可以让我们更加有效地解决各种编程问题,同时也能加深...

    位运算及其应用实例.pdf

    总之,位运算虽然在某些情况下使用较少,但它们在特定场景下具有无可替代的效率优势,是理解和掌握计算机底层工作原理的关键部分。学习和熟练运用位运算,可以帮助开发者编写更加高效和紧凑的代码。

    位运算大全

    - **模运算优化**:通过位运算代替模运算提高效率。 - 示例:`a % (2^n) == a & (2^n - 1)`。 - **位反转**:通过位运算实现整数的反转。 - 示例:`~x == -x - 1` - **位操作简化**:例如,可以使用异或运算来...

    C程序设计位运算实用PPT课件.pptx

    例如,在操作系统和驱动程序中,经常需要使用位标志来表示某些状态信息,此时位运算就可以用来快速地设置或清除这些标志位。 此外,在嵌入式系统和底层系统编程中,位运算的重要性更是不言而喻。由于这类编程通常...

    java位运算1.pdf

    - **高效计算**:位运算通常比算术运算快,因此在性能敏感的代码中,可以用来替代简单的算术操作,如快速除以2(右移一位)。 - **位掩码**:位运算可以用来设置、清除和检查特定位,这在处理标志或状态位时很有用。...

    计算机组成带移位运算实验报告

    - (1) 在哪些情况下,循环移位可以替代传统的乘法或除法运算? - (2) 如果扩展模型机以支持更多类型的移位操作(如逻辑移位),这将如何影响指令集和硬件设计? 通过这个实验,学生不仅能掌握计算机硬件级别的...

    运算放大器可以替代比较器吗

    许多运算放大器都在输入端之间有电压钳位,其大多数一般都使用背靠背二极管(有时使用两个或者更多的串联二极管)来实施。这些二极管保护输入晶体管免受其基极结点反向击穿的损害。差动输入为约 6V 时便会出现许多 IC ...

    老生常谈PHP位运算的用途

    - 计算整数的平均值而不产生溢出,使用位运算替代除法运算,避免溢出问题。 - 判断一个整数是否是2的幂:`((x & (x - 1)) == 0) && (x != 0)`,如果一个正整数x是2的幂,则x的二进制表示只有一个1,而x减1后所有的位...

    位运算的一些技巧

    例如,`15 & 7`可以替代`15 % 8`,因为8的二进制表示是1000,7是8-1,其二进制表示是0111,与运算后保留了最后三位,得到求余结果。 5. **乘法与减法的化简**: - 乘法技巧:`0x08 * 7`可以转换为`(0x08 ) - 0x08`...

    运算放大器可以替代比较器吗?

    许多运算放大器都在输入端之间有电压钳位,其大多数一般都使用背靠背二极管(有时使用两个或者更多的串联二极管)来实施。这些二极管保护输入晶体管免受其基极结点反向击穿的损害。差动输入为约 6V 时便会出现许多 IC ...

    简单了解python的一些位运算技巧

    通常情况下,我们会使用模运算 `%` 来判断一个数是奇数还是偶数。但更高效的方法是利用位运算。因为所有偶数的最低位都是0,而所有奇数的最低位都是1。因此,我们可以通过与1进行按位与运算 (`&`) 来判断一个数是...

    大整数加减乘除运算

    1. 使用位运算:利用二进制表示的大整数,可以高效地进行位移、与、或、异或等操作。 2. 哈希表:存储已计算过的中间结果,避免重复计算。 3. 分治算法:如Karatsuba乘法,将大整数分解成较小的部分,降低计算复杂度...

Global site tag (gtag.js) - Google Analytics