You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算按位非(Bitwise NOT)运算?以PHP中~-9=8为例

搞懂PHP中按位非~对负数的计算逻辑

嘿,我明白你为啥困惑——按位非和补码结合起来确实容易绕晕。咱们一步步把这个问题掰碎了说清楚,就从你提到的例子入手:

$a = -9; 
echo ~$a; // 输出8

核心原理:计算机用补码存储负数

首先得明确:计算机里所有整数(包括负数)都是以补码形式存储的,按位非操作是直接对补码的每一位取反,而不是对原码操作。咱们用32位整数来举例(PHP实际用的位数更多,但原理完全一致):

步骤1:计算-9的32位补码

  1. 先找9的二进制原码:00000000 00000000 00000000 00001001
  2. 对9的原码按位取反:11111111 11111111 11111111 11110110
  3. 再加1得到-9的补码:11111111 11111111 11111111 11110111

步骤2:对-9的补码执行按位非~

把补码的每一位0变1、1变0:
00000000 00000000 00000000 00001000
这个二进制对应的十进制就是8,这就是输出结果的由来。

解答你的困惑点

你之前尝试用-9的原码1001取反得到0110,这里的问题是混淆了原码和补码——计算机里不会直接存储负数的原码,所以不能用原码来做按位非操作,必须先转成补码。

关于考试里的规律:是否正确?

你提到的“把-9转为9再减1得到8”这个规律,完全正确!因为按位非有个通用数学公式:

~x = -x - 1

咱们代入验证:
~(-9) = -(-9) - 1 = 9 - 1 = 8,完美匹配结果。反过来试一下~8,按照公式应该是-8-1=-9,你可以在PHP里运行echo ~8;,确实会输出-9。

这个公式的本质就是补码运算的简化,考试里直接用这个公式计算,比一步步转二进制补码快多了!

内容的提问来源于stack exchange,提问作者user9718914

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:45:09