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

Bitwise NOT(按位取反)运算符结果不符合预期的技术问询

为什么按位取反后结果是-(x+1)而不是预期的二进制反转值?

这是因为C语言中int类型是有符号整数,采用补码规则存储,你混淆了"仅反转有效位"和"反转所有位(包括符号位)"的区别。

具体到你的例子:

x的值是0b110000(十进制48),假设是32位系统的int,它的完整二进制补码表示是:

00000000 00000000 00000000 00110000

执行~x按位取反后,所有位(包括前面的符号位)都会被反转,得到:

11111111 11111111 11111111 11001111

这个二进制是补码形式,要转换为十进制,需要遵循补码转原码的规则:

  1. 补码减1:11111111 11111111 11111111 11001110
  2. 符号位不变,其余位取反:10000000 00000000 00000000 00110001
    这个原码对应的十进制就是-49,正好符合你发现的y=-(x+1)规律。

规律的本质:

在补码规则下,对于任意有符号整数x,x + (~x)的结果是所有位全为1的二进制数,而这个数的补码表示恰好是-1。由此可以推导出:

~x = -1 - x = -(x + 1)

如果你想得到仅反转低几位的结果:

比如你预期的0b001111(十进制15),可以用位掩码来保留指定位数的反转结果,高位清零:

int y = ~x & 0b1111; // 仅反转低4位,结果为15

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:22:55