➗ 取模 / 取余与位运算
取模区:a、b。位运算区:x、y、移位 k、位宽 W——位移、rol/ror、popcount/clz/ctz(均基于 asUintN(W,x))、以及 &|^ 的 BigInt 与 W 位两套结果。
u = asUintN(W,x);逻辑右移、rol/ror、位计数与「W 位」位运算均基于此宽度。
适用场景
取模/取余常用于循环下标、奇偶判断、哈希分桶、分页偏移、时间周期、密码学算法练习和编程语言行为核对。位移常用于标志位、权限掩码、哈希与校验、固定宽度协议字段、以及核对某语言对移位是否符合预期。
取模与取余的区别
当 a 和 b 都是正数时,取余和取模通常结果相同;出现负数时,不同语言的规则可能不同。JavaScript 的 % 是余数运算,结果符号跟被除数一致;数学 modulo 通常把结果规范到 0 <= r < |b|。
位移:算术右移、逻辑右移与 JavaScript >>>
左移 x << k 等价于乘以 2^k(BigInt 溢出语义由类型本身决定,不存在固定宽度截断,除非你在别处掩码)。算术右移 x >> k 对负数会在高位补 1。逻辑右移按无符号位串理解:本页用 BigInt.asUintN(W, x) 把值限制在 W 位无符号范围,再执行 >> k,用于对齐「W 位 CPU / 协议字」上的逻辑右移。
注意:JavaScript 中 >>> 只对被转成 32 位无符号整数之后的 Number 有意义;BigInt 没有 >>>。若你把本页的 W 设为 32,可与「先把数值落到 32 位再 >>>」的心智模型对照。
循环移位与位计数
rol / ror 在 u = asUintN(W, x) 上操作,旋转量取 k mod W(W=1 时恒等)。popcount 统计 u 中 1 的个数。clz 为 W 位视角下的前导零个数(u=0 记为 W);ctz 为尾随零个数(u=0 记为 W,表示字内全零)。
与 / 或 / 异或
同时给出两套:BigInt 原始(按语言无限精度逐位运算)与 W 位无符号(两操作数先 asUintN 再运算并绕回)。对照寄存器或协议字段时用后者;核对 JS BigInt 表达式时用前者。
使用建议
- 如果用于数组下标循环,建议使用数学 modulo,避免负数下标。
- 如果要模拟某门语言的行为,请按该语言文档确认商的取整方式。
- 本工具只处理整数;小数取模、IEEE 浮点误差和补码溢出不在本页处理。
- 位移位数请使用非负整数;左移对 BigInt 会拉长位数,本页仍限制
k上限以防卡顿;旋转仅依赖k mod W。 - 需要做进制换算可使用 进制转换器;需要 IP 网段数量与范围可使用 IP 子网/CIDR 计算器。
隐私说明
计算在浏览器本地完成(详见 隐私说明),输入数字不会上传到服务器。
