剑指offer_11_二进制中1的个数

题目描述

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

#include <iostream>
using namespace std;
class Solution1 {//递归实现
public:
int  NumberOf1(int n) {
unsigned int us_n = n;
if (n == 0)return 0;
return(us_n & 1) + NumberOf1(us_n >> 1);
}
};
class Solution {//依次遍历
public:
int  NumberOf1(int n) {
unsigned int us_n = n;
int sum = 0;
while (us_n != 0)
{
if (us_n & 1)sum++;
us_n = us_n >> 1;
}
return sum;
}
};
int main()
{
Solution1 mys;
cout << mys.NumberOf1(-219);
cout << "end" << endl;
system("pause");
}

最优解法如下:


总结:

1.c++判断一个数的奇偶性,n%2和n&1是一样的作用,但是n&1要快。

2.带符号的数和无符号的数C++会做不同处理,如果你想得到无符号移位,先将表达式

强制转换为无符号类型,然后再移位(汇编中移位也有算数移位和逻辑移位两种指令)

3.对于一个x个bit的数,普通遍历每一位的解法要遍历约x次,最优解循环的次数只需

要遍历1的个数次,通过n=n&(n-1),每次可很高效地将数(二进制形式)最右端的1置

为0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值