编程竞赛备考:与运算符(&)结合减号(-)的作用是什么?
理解
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ı
相关产品推荐
相关产品推荐

