问题:检查非负整数是否具有2^j - 2^k where j>=k>=0
形式,即2的幂次差。我的解决方案:数字n (say)
可以表示为1的for eg. 00011110
的连续序列。我将关闭连续的1序列(最右边),并对n
进行零检查。我在这里所做的是,steps for solution
00011110
00011111(turn on trailing 0's)
00000000(then turn off trailing 1's)
。使用该公式(x | (x - 1)) & (x | (x - 1) + 1)
。但是,不使用文字的更有效的公式(可能是由于较少的运算量)是((x & -x) + x) & x
,后跟零校验。我不明白这一点,但它写的是做同样的事情,只是无法从我的结果中得出公式。谁可以给我解释一下这个?
编辑:32位字,2的补码
鉴于-x
为~x + 1
,如果数字的格式为2 ^ j-2 ^ k,则: