我是靠谱客的博主 犹豫嚓茶,最近开发中收集的这篇文章主要介绍i&i-1的作用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先来看一个函数

#include <stdio.h>

int fun(int i) 
{ 
    int cnt = 0; 
    while(i) 
    { 
        cnt++; 
        i = i&(i-1); 
    } 
    
    return cnt; 
} 

int main()
{ 
    printf( "%dn", fun(2017) );
    
    return 0;  
}

思考:上面这个函数的作用是什么?!

答案: 我们首先来看一下 i&(i-1), i&(i-1)的作用是将i的二进制表示中的最低位为1的改为0。在本题中即数出2017转换成二进制有几个1就会走几次循环。2017对应的二进制是:10000111111,一共7个1,故走7次。

拓展:

1)判断n是不是2的次幂
    bool isPowerOfTwo(int n) {
        return n>0&&(n&(n-1))==0;
    }
2)判断n是不是3的次幂
3)判断n是不是4的次幂
    bool isPowerOfFour(int num) {
        return num>0&&(num&(num-1))==0&&(num-1)%3==0;
    }

证明:
(1)首先证明(4^n - 1) % 3 == 0:
4^n - 1 = (2^n + 1) * (2^n - 1),连续的三个之间必定有一个数是3的倍数,2^n 一定不是3的倍数,所以(2^n + 1)和(2^n - 1)中必定有一个是3的倍数,所以(4^n - 1)一定是3的倍数

(2)对于2^ n, 当n是奇数时,2^n 不是4的次幂,当n是偶数时,2^n 是4的次幂。
2^ n 等于(3-1)^n
回顾一下:(a+b)的n次方的展开式是多少?
由二次项定理 (a+b)n次方=C(n,0)a(n次方)+C(n,1)a(n-1次方)b(1次方)+…+C(n,r)a(n-r次方)b(r次方)+…+C(n,n)b(n次方)(n∈N*)
2^n = (3-1)^n = C(n,0)3^ n *(-1)^ 0+…+(-1)^n.
上式中,除了最后一项(-1)^ n,其余项均为3的倍数,可以得到当n为奇数时, (-1)^ n等于-1,那么(2^ n-1)%3!=0,当n为偶数时, (-1)^ n等于1,那么(2^ n-1)%3==0。

所以,综上所述,加一个筛选条件(num-1)%3==0,即可从符合2的次幂的数中筛选出符合4的次幂的数。

最后

以上就是犹豫嚓茶为你收集整理的i&i-1的作用的全部内容,希望文章能够帮你解决i&i-1的作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部