[剑指offer]JT11---二进制中1的个数** n&(n-1)你不得不知道の含义呀0.0!**

剑指offer第十一题

题目如下

在这里插入图片描述

思路分析与代码

同学们看到这个题,肯定第一反应就是while,然后%2,/2,cnt++,就可以找到所有的1了。

其中负数有个反码的操作,如果是负数,那么第一个符号位是1,剩下的,我们先计算出其相反数的1的个数,之后用31减去这个数再加1,也就是32-正数的1的个数就可以得出负数的1的个数了!!!

但是这里,我们要介绍一个很厉害的方法,那就是n&(n-1)这个的含义就是将n的最后的第一个1置为0,它可以更加直接的找到1的个数,就不用像前面那样还要先计算正数什么的,可以一步到位。

举个例子
n=xxxx10000
二进制 xxxx10000-1 = xxxx01111
n&n-1=xxxx10000 & xxxx01111 =xxxx00000

数的从右向左数的第一个1被置为0了,那么到n为0为止,我们就可以通过这个方法来得到数字含有多少个1了。

class Solution {
public:
     int  NumberOf1(int n) {
         int ret=0;
         while(n){
             ++ret;
             n=n&(n-1);
         }
         return ret;
     }
};

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页