二进制中1的个数

来源:互联网 发布:gifcam mac版下载 编辑:程序博客网 时间:2024/06/06 02:54

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

位运算基础

  • 左移操作:m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。如:00001010<<2=0010100010001010<<3=01010000.
  • 右移操作:最右边n位被丢弃
    • 无符号数:用0填补最左边的n位
    • 有符号数:用数字的符号位填补最左边的n位
    • 例子:00001010>>2=0000001010001010>>3=11110001

思路一:先判断最右边是不是1,然后右移一位,依次循环。但当是负数时会进入死循环。
思路二:将n和1做与运算,判断n的最低位是不是1。接着把1左移一位得到2,再和n做与运算,能判断n的次低位是不是1。

int NumberOf1(int n){    int count = 0;    unsigned int flag = 1;    while (flag){        if (n & flag){            count ++;        }        flag = flag << 1;    }    return count;}

思路三:把一个整数减去1,会把最右边的1变成0,若它右边还有0的话,所有的0都变成1,而它左边所有位都保持不变。把一个整数和它减去1的结果做位与运算,相当于把最右边的1变成0。

int NumberOf1(int n){    int count = 0;    while (n){        ++count;        n = (n - 1) & n;    }    return count;}

测试用例

  • 整数(包括边界值1、0x7FFFFFFF)
  • 负数(包括边界值0x80000000、0xFFFFFFFF)
  • 0.

相关题目

  • 用一条语句判断一个整数是不是2的整数次方
    • 一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。把这个整数减去1之后再和它自己做与运算,这个整数中唯一的1会变成0。
  • 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
    • 求这两个数的异或,再统计异或结果中1的位数

相关技巧:把一个整数减去1之后再和原来的整数做位于运算,得到的结果相当于把整数的二进制表示中的最右边一个1变成0。

0 0
原创粉丝点击