如何计算按位非(Bitwise NOT)运算?以PHP中~-9=8为例
搞懂PHP中按位非~对负数的计算逻辑
嘿,我明白你为啥困惑——按位非和补码结合起来确实容易绕晕。咱们一步步把这个问题掰碎了说清楚,就从你提到的例子入手:
$a = -9; echo ~$a; // 输出8
核心原理:计算机用补码存储负数
首先得明确:计算机里所有整数(包括负数)都是以补码形式存储的,按位非操作是直接对补码的每一位取反,而不是对原码操作。咱们用32位整数来举例(PHP实际用的位数更多,但原理完全一致):
步骤1:计算-9的32位补码
- 先找9的二进制原码:
00000000 00000000 00000000 00001001 - 对9的原码按位取反:
11111111 11111111 11111111 11110110 - 再加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
相关产品推荐
相关产品推荐

