判断数字中有多少位1

使用最后一位-1,来判断数中有多少位1

flag=0;
while (x) {
    x = x & (x - 1);
    flag++;
}

这个循环会不断执行以下操作,直到x变为0为止:

  1. x - 1:将x的二进制表示中最右边的1变为0,并将该位右边的所有位变为1。
  2. x & (x - 1):将x的二进制表示中的1与x - 1的结果相应位置的1进行按位与操作,从而将最右边的1变为0。

下面以一个例子来说明这个过程。假设x的初始值为200(二进制表示为11001000):

第一次循环:

  • x - 1 的结果为11000111
  • x & (x - 1) 的结果为11000000。此时,x的值变为11000000,flag的值为1。

第二次循环:

  • x - 1 的结果为10111111
  • x & (x - 1) 的结果为10000000。此时,x的值变为10000000,flag的值为2。

第三次循环:

  • x - 1 的结果为01111111
  • x & (x - 1) 的结果为00000000。此时,x的值变为0,flag的值为3。

最终,循环结束,flag的值为3,表示200的二进制表示中有3个1。

这个循环的关键在于每次执行x = x & (x - 1)操作时,都会消除x的二进制表示中最右边的1。通过重复这个过程,我们可以计算出x的二进制表示中1的个数。这种方法在计算一个整数的二进制表示中1的个数时非常高效。

 另一个方法,也比较常用,一直向右移动,判断多少位1

int countOnes(int num) {
    int count = 0;
    while (num != 0) {
        if (num & 1) {
            count++;
        }
        num = num >> 1;
    }
    return count;
}

 

你可能感兴趣的:(数据结构)