You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中执行无检查乘法以避免溢出Panic?

无检查乘法实现方案

问题场景

原代码执行时因乘法溢出触发panic:

let count: u64 = (((b + (b >> 4)) & 0xF0F0F0F0F0F0F0Fu64) * 0x101010101010101u64) >> 56;

错误信息:

thread 'main' panicked at 'attempt to multiply with overflow', src/main.rs:102:22
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

需求:让乘法操作溢出时直接丢弃超出位数的部分,不触发panic。

最简单实现方式

直接使用Rust内置的wrapping_mul方法替代普通乘法运算符*,该方法会安全执行溢出后截断的乘法操作,无需unsafe代码:

let count: u64 = (((b + (b >> 4)) & 0xF0F0F0F0F0F0F0Fu64).wrapping_mul(0x101010101010101u64)) >> 56;

若需使用unsafe方式(不推荐,需明确知晓风险),可使用unchecked_mul方法并包裹在unsafe块中:

let count: u64 = unsafe {
    (((b + (b >> 4)) & 0xF0F0F0F0F0F0F0Fu64).unchecked_mul(0x101010101010101u64)) >> 56
};

算法说明(翻译自Stack Overflow对应回答)

该算法用于快速统计64位无符号整数中二进制位为1的个数,核心步骤:

  • 计算每4位的1的个数:将原数b右移4位后与自身相加,再和掩码0xF0F0F0F0F0F0F0F0做按位与。这一步会把每个4位组(半字节)中1的个数存储到该组的高4位位置。
  • 累加所有4位的统计结果:将上一步的结果与魔法数0x101010101010101相乘,利用乘法溢出截断的特性,把每个字节的高4位数值累加到结果的高位字节中。
  • 提取最终统计值:将乘积右移56位,得到所有4位组的1的个数总和,也就是原数中所有二进制1的总数。

内容的提问来源于stack exchange,提问作者hobrin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:40