程序员计算器与位运算计算器

输入一个表达式,可以使用 0x 十六进制、0b 二进制、0o 八进制字面量,位运算符 & | ^ ~,移位 << >> >>>,循环移位以及普通四则运算 — 结果会以十进制、十六进制、八进制、二进制四种进制实时更新,字长可选 8、16、32 或 64 位,有符号/无符号均可。下方还有可点击的位网格、双操作数位运算面板(AND / OR / XOR / NAND / NOR / NOT / 移位 / ROL / ROR)和单比特置位 / 清零 / 翻转。只需进制转换、不涉及位逻辑请看进制转换器;统计计算请看统计计算器。
字长   视图   运算符:& | ^ ~ << >>> + - * / % ( ) — 仅整数运算,结果按字长回绕。
DEC
HEX
OCT
BIN
位按最高位在左显示;变暗的单元格在当前字长之外。
位序号(0 = 最低位)
A =    B =  A 和 B 接受完整表达式(例如 1 << 12)。
A 和 B 都能解析后就会出现结果表。移位与循环移位的次数取自 B。
试个例子:
移位的行为:<< 会先按字长取模(从顶部掉出去的位就丢了)。>>> 始终是逻辑(无符号)右移。>> 跟随视图选择器:有符号模式下是算术移位,无符号模式下是逻辑移位。隐私:整个计算器都在当前标签页内运行 — 无服务器、无存储。

什么是程序员计算器?

程序员计算器做的是计算机存储数值的方式:固定宽度的比特字。它不是一条无尽的数轴 — 8 位字是 256 个值组成的一个圆环,32 位字是 4,294,967,296 个值的圆环。每个结果都会回绕进这个圆环,同一组比特既可以按无符号计数来读(0 … 255),也可以按有符号二进制补码来读(-128 … 127)。上方的四个进制行是同一组比特的四种写法 — 改一个,另外三个跟着变。

为什么程序员离不开十六进制

一个十六进制位正好是 4 个二进制位,所以一个字节永远是两个十六进制位,32 位字永远是八个。

二进制十六进制十进制
1111 11110xFF255
0001 01100x1622
1000 00000x80128(有符号时是 -128)

一段话看懂二进制补码

要把一个字读成有符号数,看最高位。如果是 0,值就是无符号计数本身。如果是 1,减去圆环的大小:8 位的 0xFF 是 255 − 256 = −1。窍门就这么点 — -x 和 0 - x 产生的比特完全相同,所以同一套加法器硬件对两者都适用。取负号就是"每一位取反,再加 1":NOT(0x01) = 0xFE,+1 = 0xFF = −1。

移位运算符速览

运算符名称8 位示例(a = 0xF0)
a << 1左移0xE0 — 最高位掉出去,低位补 0
a >> 1(无符号)逻辑右移0x78 — 高位补 0
a >> 1(有符号,a = −16)算术右移0xF8 = −8 — 符号位被复制
a >>> 1始终是逻辑移位0x78 与视图选择器无关
rol(a, 1)循环左移0xE1 — 掉出的最高位从底部重新进入

本页帮你避开的常见错误

算术移位与逻辑移位:复制符号位(算术)与补零(逻辑)在最高位为 1 时结果不同 — 切换视图选择器,观察 0xF0 >> 1 在 0x78 和 0xF8 之间变化。
53 位意外:JavaScript 的普通 Number 是只有 53 个安全整数位的 64 位浮点数,所以 0xFFFFFFFFFFFFFFFF 无法精确表示 — 本页内部使用精确的 64 位整数运算,你看到的每一个十六进制位都可信。
浮点陷阱:0.1 + 0.2 在浮点数里著名的给出 0.30000000000000004;本计算器按设计只做整数 — 除法向零截断,与 C 语言对整数用 / 完全一致。
前导零:在老式 C 里 052 这样的字面量表示八进制。这里十进制就是普通数字,八进制必须带 0o 前缀,不会有歧义。

常见问题

最大的数是多少? — 64 位无符号:18,446,744,073,709,551,615(0xFFFFFFFFFFFFFFFF);有符号:±9,223,372,036,854,775,808。
为什么 1 << 8 变成了 0? — 字长是 8 位;第 8 位不存在,掩码把它丢掉了。切到 16/32/64 位就能保留。
~ 做什么? — 按位取反:当前字长内每一位都翻转,所以 ~0 是全 1(255 / 65535 / −1 …)。
有浮点数吗? — 没有,只做整数;浮点、三角函数请用科学计算器。
有数据离开我的电脑吗? — 没有:无服务器、无存储、无统计;关掉标签页一切消失。