剑指offer编程-二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
1.数字在计算机中本身为2进制存储,则每次判断数字末尾是不是1(与1相与),若为1计数加一,然后把数字右移一位,不断重复,直至为零。----会造成死循环,考虑负数的情况,右移后左边位补充1。
**虽然右移操作和除2等价,但是除法运算的效率比移位运算低的多。
2.数字不移位,先用1和数字相与,判断最后一位,然后将1左移一位与数字相与,判断倒数第二位。直至左移后为0。----整型有多少位就需要左移多少次(int 32位需要左移32次)。
3.把整数减去1,再于原来的整数做与运算 《==》把该整数最右边的1变为0。 。 ==》  整数中有多少个1,就能进行多少次这样的操作。
     int  NumberOf1(int n) {
         int count=0;
         while(n){
             ++count;
             n = (n-1)&n;
         }
         return count;
     }

测试用例

  • 正数(包括边界值1,0x7FFFFFFF)
  • 负数(包括边界值0x8000000,0xFFFFFFFF)
  • 0

相似题目

  1. 用一条语句判断一个数是不是2的整数次幂:二进制表示中只有一位为1的数是2的整数次幂。则将该整数减去1的结果和该整数本身做与运算,会得到0。
  2. 输入两个整数m n,需要改变m的二进制表示中的多少位才能得到n:第一步,将两数做异或运算。第二步,统计异或结果中1的个数。
posted @ 2017-09-27 12:00  usj  阅读(141)  评论(0)    收藏  举报