对于任意二进制数,每次加减只能扰动其从右向左数的第一个1以及之后的位数
eg:
对于110000011000011100
减1时
得 110000011000011011
很显然只有0,1,2位扰动
用‘与’符号,运算 被减数 & 得数
得到剩余未被扰动的数
110000011000011000
此时一个1已被计算,并被‘排’出
循环此过程,即可得出所有的1。
此外
对于任意数n,其2进制位数不会大于log(n)
比如8->111
16->1111
因此其时间长度为O(log(n))
Brian Kernighan 算法证明
于 2022-03-05 15:10:43 首次发布