piapia123
zh

二进制按位运算

转换

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

十种按位运算放在一个工具里,是因为它们的输入输出形态完全一样,差别只有一个运算符 —— 拆成十个页面的话,十份内容几乎逐字相同,搜索时还会互相稀释。 为什么不用 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 位掩码、超大整数也精确,不经过浮点

使用方法

  1. 粘贴要运算的数,一行一个(支持 0b / 0o / 0x 前缀)
  2. 选运算、位宽,填第二个操作数
  3. 结果实时更新,点某一行的复制按钮取走数值

常见问题

为什么结果和我在代码里算的不一样?
最可能的原因是你用的是 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 的 `>>` 对负数就是算术右移。

相关工具