求正整数的二进制表示中最低位1的位置

原问题为:求N!的二进制表示中最低位1的位置。

来自编程之美2.2 不要被阶乘吓倒

后发现可以改为:求正整数的二进制表示中最低位1的位置


对于这道题书中只有简单的介绍,但自己实际接触后并不那么简单。

书中给出答案即 N!含有质因数2的个数加1,但其实任何数的二进制最低位1的位置都是质因数2的个数加1.

从简单的开始归纳:

假设二进制中从1开始,每乘一次2,1就会向左移一位,00000001×2=000000010,000000010×2=000000100.

所以可以简单归纳为2^n的二进制最低位1的位置就为n+1。

然后继续+1,

假设我们求2^n+1的二进制最低位1的位置,

2^n+1除以2有余,说明没有2的质因数,所以二进制最低位1的位置就为1.

2^n+2=2(2^(n-1)+1),除以2后实际还是上一行的结果(或者说上一行的结果乘以2,使1往左移1位),所以二进制最低位1的位置就为2.

2^n+3除以2有余,因为2^n为偶数加上任何奇数都为奇数,奇数不能整除2,所以2^n加上任何奇数二进制最低位1的位置就为1.

2^n+4=2^2(2^(n-2)+1),除以2的2次方后还是上上上一行的结果.

所以2^n+2^k*b=2^k(2^(n-k)+b)的二进制最低位1的位置就为K,(2^k*b为偶数)


回到问题中来,若正整数为奇数,则二进制最低位1的位置必然为1,若正整数为偶数,从式子中分析,(2^(n-k)+b)必为奇数,实际我们就回到问题的开始,2^n+1的二进制最低位1的位置必然为1,然后乘以2^k,相当于每乘以1次2,即使1往左移1位,所以k实为1移动的次数,+1即为1的位置,即其实任何正整数的二进制最低位1的位置都是质因数2的个数加1.



你可能感兴趣的:(数学,二进制)