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

编程竞赛备考:与运算符(&)结合减号(-)的作用是什么?

理解result=number-(number&-number)的功能

嘿,我来帮你拆解这段代码里的核心逻辑!这行代码里的位运算技巧其实是编程竞赛里很常用的知识点,咱们一步步来理清楚:

先搞懂number & -number到底在算什么

要理解这个操作,得先回忆计算机里负数的存储规则:负数是以原数的补码形式存储的,补码的计算方式是「对原数二进制按位取反,再加1」。

举个具体例子:

  • 假设number=6,二进制是...00000110(高位的0省略了)
  • 对它按位取反得到...11111001,再加1就变成...11111010——这就是-6的二进制表示

当把原数和它的负数做按位与(&)运算时,神奇的事情发生了:结果会只保留原数二进制里最右边的那个1,其余所有位都变成0。还是用6举例:

  • 6的二进制:000...0110
  • -6的二进制:111...1010
  • 按位与结果:000...0010(也就是十进制的2),正好对应6的二进制里最靠右的那个1的数值

再换几个例子验证:

  • 如果number=5(二进制000...0101),-5是111...1011,按位与结果是000...0001(1)
  • 如果number=8(二进制000...1000),-8是111...1000,按位与结果是000...1000(8)

整行代码的功能

那result=number-(number&-number)的作用就很明确了:把原数二进制里最右边的那个1给去掉,得到一个新的整数。
对应上面的例子:

  • 6去掉最右边的1:6-2=4(二进制000...0100)
  • 5去掉最右边的1:5-1=4(二进制000...0100)
  • 8去掉最右边的1:8-8=0(二进制000...0000)

这个技巧在编程竞赛里挺实用的,比如统计二进制中1的个数、处理树状数组(Fenwick Tree)的索引计算时都会用到。

内容的提问来源于stack exchange,提问作者Sinan Yumurtacı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:24