我想做一个未经检查的乘法,这样它在乘法时就不会返回错误,而只是丢弃这些位。
代码:
102 let count: u64 = (((b + (b >> 4)) & 0xF0F0F0F0F0F0F0Fu64) * 0x101010101010101u64) >> 56;
Run Code Online (Sandbox Code Playgroud)
错误:
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
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?
顺便说一句:我试图实现的算法是这样的: /sf/answers/189666641/
你不想要unchecked_mul(),你真的不想要。它会导致 UB 溢出,而您只想丢弃溢出的位。
你需要的是wrapping_mul():
let count: u64 = (((b + (b >> 4)) & 0xF0F0F0F0F0F0F0Fu64).wrapping_mul(0x101010101010101u64)) >> 56;
Run Code Online (Sandbox Code Playgroud)