二进制按位运算
转换所有处理都在浏览器本地完成,数据不上传服务器
十种按位运算放在一个工具里,是因为它们的输入输出形态完全一样,差别只有一个运算符 —— 拆成十个页面的话,十份内容几乎逐字相同,搜索时还会互相稀释。 为什么不用 JavaScript 自带的位运算符? 因为它们先转成 32 位有符号整数:`1 << 31` 得到 `-2147483648`,`0xFFFFFFFF` 变成 `-1`,超过 32 位的数直接被截断 —— 而这一切不报任何错。做位运算的人手里常常是 64 位掩码、哈希片段、UUID 拆出来的整数,那些在 JS 运算符下全是错的。这里全程用 BigInt,`<<` 可以随便移,`&` 也不会突然变成负数。 位宽是取模与显示的口径。 选 32 位时,操作数先对 2³² 取模(`-1` 于是变成全 1,这正是补码的意思),结果显示成补齐到 32 位的二进制。选「不限」则不取模、不补零,`~0` 就是 `-1` —— 数学上正确,但对做掩码的人来说不是想要的,所以默认给 32 位。
功能
- 十种运算:与、或、异或、同或、与非、或非、非、左移、右移、位序逆序
- 结果同时给出十进制、二进制、十六进制与位数,逐行可复制
- 输入支持 0b / 0o / 0x 前缀与十进制,`_` 和空格可以当分隔符直接粘
- 位宽 8 / 16 / 32 / 64 可选,也可以选「不限」走 BigInt 任意精度
- 位宽给了就先按补码取模:`-1` 在 8 位下变成 255,符合预期
- 左移不会溢出成负数(JS 的 `1 << 31` 会)
- 一行一个操作数,可以批量对同一个掩码做运算
- 输入含 64 位掩码、超大整数也精确,不经过浮点
使用方法
- 粘贴要运算的数,一行一个(支持 0b / 0o / 0x 前缀)
- 选运算、位宽,填第二个操作数
- 结果实时更新,点某一行的复制按钮取走数值
常见问题
- 为什么结果和我在代码里算的不一样?
- 最可能的原因是你用的是 JavaScript 的位运算符,而它只按 32 位有符号整数算。三种典型差异:`1 << 31` 在 JS 里是 `-2147483648`(这里是 `2147483648`);`0xFFFFFFFF` 在 JS 里读出来是 `-1`;超过 32 位的操作数会被静默截断。把位宽选成「不限」就能看到不做任何截断的结果,选 32 位则与 JS 的行为对齐(除了显示成无符号)。
- 位宽该选哪个?
- 看你的数据在目标环境里是多少位的。处理 C 的 int 或 JS 的位运算选 32 位;处理 uint8 数组、RGB 通道、协议字段选 8 位或 16 位;处理 64 位掩码、哈希选 64 位;只想知道数学上的结果选「不限」。位宽只影响「取模」与「显示补零」两步,不影响运算本身的正确性。
- 右移是有符号还是无符号的?
- 无符号(逻辑右移)。原因是给了位宽之后操作数已经取过模,全是非负的 —— 非负数右移本来就没有符号可扩。所以 `0xFFFFFFFF >> 4` 得到 `0x0FFFFFFF`。需要算术右移的场合(负数保持符号位),把位宽选成「不限」,那时 BigInt 的 `>>` 对负数就是算术右移。
相关工具
进制转换
转换在二、八、十、十六、36、64 进制之间互转,六种结果一次全部给出,19 位的雪花 ID 也能一位不差。全部在浏览器本地完成。
IP 转整数
网络IP 地址与整数互转:点分十进制、无符号与有符号、十六进制、二进制,IPv6 走 128 位不失精度。
进制运算
转换在二、八、十、十六进制下做加减乘除,全程 BigInt 不截断、不回绕;除法同时给出商与余数,结果可按另一种进制显示。
时间戳转换
转换把 Unix 时间戳还原成日期时间,或反过来。秒 / 毫秒 / 微秒 / 纳秒自动识别,支持小数、负数与 Windows FILETIME。全部在浏览器本地完成。
日期计算
转换算两个日期之间相差多少天,或给一个日期加减若干天、周、月。日期用日历挑或直接粘贴,结束日期留空就与今天比较。全部在浏览器本地完成。
Cron 解析
转换把 cron 表达式逐字段讲成人话,算出接下来几次与上一次的执行时间;永远不会触发的表达式会当场说明原因。全部在浏览器本地解析。