昨天的分析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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
接着,文章探讨了位运算的实用技巧,如使用位运算替代模运算以提高效率,以及一些特定的位运算技术。 然后,文章展示了位运算如何优化数据结构: 1. **循环队列**:位运算可以简化循环队列的索引计算,减少边界...
7. **取模与乘除法的位运算替代**:在不产生溢出的情况下,可以通过位运算实现取模、乘法和除法操作。 #### 实际应用案例 - **去掉或添加二进制位**:通过右移、左移、按位或与按位与的组合使用,可以灵活地修改二...
- **取模运算转换为位运算**:当除数为2的幂时,可以直接使用位运算来替代取模运算。 ```plaintext a % (2^n) 等价于 a & (2^n - 1) ``` - **乘法运算转换为位运算**:当乘数为2的幂时,可以直接使用位运算来...
3. 输入电流问题:在一些运算放大器设计中,例如使用PNP输入晶体管的运算放大器,可能不具备输入钳位,从而允许更大的差动输入电压。但是,这些运算放大器可能在其他方面不具备比较器的性能,例如共模抑制比(CMRR)...
其中,8位算术逻辑运算实验作为该课程的一个关键实践环节,对于培养学生的实践能力、加深对计算机硬件系统工作原理的理解起到了不可替代的作用。 实验的核心在于熟悉并掌握算术逻辑运算器(ALU)的工作原理。ALU是...
位运算在计算机科学中...总的来说,位运算在编程中虽然不常用,但在特定场景下,如优化代码、处理硬件接口或进行高效计算时,它的价值是无可替代的。学习和理解位运算,有助于提高程序员在低级别编程时的技能和效率。
通过本篇对C语言位运算的深入探讨,我们了解到位运算不仅在计算机底层编程中有其不可替代的作用,而且在软件开发的许多方面也发挥着重要的作用。掌握位运算,可以让我们更加有效地解决各种编程问题,同时也能加深...
总之,位运算虽然在某些情况下使用较少,但它们在特定场景下具有无可替代的效率优势,是理解和掌握计算机底层工作原理的关键部分。学习和熟练运用位运算,可以帮助开发者编写更加高效和紧凑的代码。
- **模运算优化**:通过位运算代替模运算提高效率。 - 示例:`a % (2^n) == a & (2^n - 1)`。 - **位反转**:通过位运算实现整数的反转。 - 示例:`~x == -x - 1` - **位操作简化**:例如,可以使用异或运算来...
例如,在操作系统和驱动程序中,经常需要使用位标志来表示某些状态信息,此时位运算就可以用来快速地设置或清除这些标志位。 此外,在嵌入式系统和底层系统编程中,位运算的重要性更是不言而喻。由于这类编程通常...
- **高效计算**:位运算通常比算术运算快,因此在性能敏感的代码中,可以用来替代简单的算术操作,如快速除以2(右移一位)。 - **位掩码**:位运算可以用来设置、清除和检查特定位,这在处理标志或状态位时很有用。...
- (1) 在哪些情况下,循环移位可以替代传统的乘法或除法运算? - (2) 如果扩展模型机以支持更多类型的移位操作(如逻辑移位),这将如何影响指令集和硬件设计? 通过这个实验,学生不仅能掌握计算机硬件级别的...
许多运算放大器都在输入端之间有电压钳位,其大多数一般都使用背靠背二极管(有时使用两个或者更多的串联二极管)来实施。这些二极管保护输入晶体管免受其基极结点反向击穿的损害。差动输入为约 6V 时便会出现许多 IC ...
- 计算整数的平均值而不产生溢出,使用位运算替代除法运算,避免溢出问题。 - 判断一个整数是否是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 ...
通常情况下,我们会使用模运算 `%` 来判断一个数是奇数还是偶数。但更高效的方法是利用位运算。因为所有偶数的最低位都是0,而所有奇数的最低位都是1。因此,我们可以通过与1进行按位与运算 (`&`) 来判断一个数是...
1. 使用位运算:利用二进制表示的大整数,可以高效地进行位移、与、或、异或等操作。 2. 哈希表:存储已计算过的中间结果,避免重复计算。 3. 分治算法:如Karatsuba乘法,将大整数分解成较小的部分,降低计算复杂度...