如何在Rust中实现无符号右移(>>>)操作?
如何在Rust中实现JavaScript的无符号右移(>>>)效果
无符号右移的效果是将操作数的二进制位整体向右移动指定位数,左侧空出的位统一补0,不会保留原数的符号位,结果始终为非负整数。
核心实现逻辑
Rust中对无符号类型的右移运算符>>本身就是无符号右移行为,对有符号类型的右移则是保留符号位的算术右移。因此要实现和JavaScript一致的无符号右移,只需要先将有符号操作数转为对应位宽的无符号类型,再执行右移操作即可。
注意:JavaScript中的移位操作会先将操作数转换为32位整数再计算,要完全对齐JS行为,建议统一使用32位类型做转换。
代码示例
基础实现(对齐JS默认32位行为)
// 模拟JavaScript的>>>运算符 fn unsigned_right_shift(x: i32, n: u32) -> u32 { // 先转为无符号32位整数,再执行右移 x as u32 >> n }
测试用例
和JavaScript运行结果完全对齐:
- JS中
5 >>> 2返回1,对应Rust实现:assert_eq!(unsigned_right_shift(5, 2), 1); - JS中
-1 >>> 0返回4294967295,对应Rust实现:assert_eq!(unsigned_right_shift(-1, 0), 4294967295); - JS中
-5 >>> 2返回1073741822,对应Rust实现:assert_eq!(unsigned_right_shift(-5, 2), 1073741822);
其他位宽适配
如果需要处理64位等其他位宽的数值,对应转换为同宽度的无符号类型即可:
// 64位无符号右移 fn unsigned_right_shift_64(x: i64, n: u32) -> u64 { x as u64 >> n }
内容的提问来源于stack exchange,提问作者Nazar Kalytiuk
相关产品推荐
相关产品推荐

