剑指offer:二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解题思路:

  1. 针对正数,将该数对2取余,当余数是1时进行加1,再将该数除以2,循环进行
  2. 针对负数,可考虑先将其转换为正数 ,其转换规则为其原码等于其补码取反再加1
    例如:已知一个补码为11111001,则原码是10000111(-7)。
    因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
    其余七位1111001取反后为0000110;
    再加1,所以是10000111。

二、实现代码

class Solution {
public:
     int  NumberOf1(int n) {
         int a,b,num=0;
         unsigned int number = n;
         //对负数取其对应的正数
         if(n<0){
             number = ~(-n)+1;
         }

         while(number>0){
             if(number%2)
                 num++;
             number = number/2;
         }
         return num;
     }
};

猜你喜欢

转载自blog.csdn.net/yph001/article/details/80964490