根据请求者的要求,这个解决方案最初是以二进制形式呈现的,然后转换为常规数学形式。
虽然加减法可能不会有什么影响,但至少乘以2和除以2应该改为<<1和>>1以提高速度,如果使用掩码而不是nBits,并使用位移而不是乘除法,并将尾递归改为循环,则此解决方案可能是您能找到的性能最佳的解决方案,因为每次调用都只需要进行一次加法操作,它只会像Alnitak的解决方案一样变慢,每4次甚至8次调用一次。
int incrementBizarre(int initial, int nBits)
mask=2^(nBits-1)
if(initial < mask)
return initial+ mask
else
if(mask / 2) > 0
return incrementBizarre(initial - mask, mask/2)
else
throw new OverflowedMyBitsException()
哇,这个结果看起来很酷。我直到最后一秒才想到递归。
感觉有些不对——好像有些操作不应该起作用,但由于你所做的事情的性质(就像感觉当你在操作一个位时,左边的一些位是非零的,你应该会遇到麻烦,但事实证明,除非所有左边的位都是零,否则你永远不可能操作一个位——这是一个非常奇怪的条件,但却是真实的。
从110到001的流程示例(向后3个到向后4个):
mask 100 (4), initial 110 (6); initial < mask=false; initial-mask = 010 (2), now try on the next bit
mask 010 (2), initial 010 (2); initial < mask=false; initial-mask = 000 (0), now inc the next bit
mask 001 (1), initial 000 (0); initial < mask=true; initial + mask = 001--correct answer