剑指Offer系列---(13)二进制中1的个数
来源:互联网 发布:淘宝广告报价 编辑:程序博客网 时间:2024/05/21 12:44
1.题目描述:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
2.分析:
1)把一个整数减去1,都是把最右边的1变成0.如果它的右边还有0的话,所有的0都变成1,而它左边所有位都保持不变。
2)把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
3.源代码:
// Copyright (c) 2015年 skewrain. All rights reserved.#include <iostream>#include <stdio.h>using namespace std;int NumberOf1(int n){ int count = 0; while (n) { ++count; n = (n-1)&n; } return count;}int main(int argc,char *argv[]){ int n; cout<<"请输入一个整数:"; cin>>n; cout<<"数字"<<n<<"的二进制中含有1的个数为:"<<NumberOf1(n)<<endl; return 0;}
4.相关知识点:
位运算一共只有5种:与、或、异或、左移和右移。
左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。如果数字是一个无符号数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。也就是说如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。
0 0
- 剑指Offer系列---(13)二进制中1的个数
- 剑指offer系列源码-二进制中1的个数
- 剑指offer系列之十:二进制中1的个数
- 【剑指offer系列】 二进制中1的个数___10
- 剑指offer系列之9:二进制中1的个数
- 剑指offer系列-T10二进制中1的个数
- 剑指offer:二进制中1的个数
- 剑指offer:二进制中1的个数
- 【剑指offer】二进制中1的个数
- [剑指Offer]二进制中1的个数
- 【剑指offer】二进制中1的个数
- 剑指offer--二进制中1的个数
- 剑指offer:二进制中1的个数
- 剑指offer 二进制中1的个数
- 剑指offer 二进制中1的个数
- 《剑指offer》二进制中1的个数
- 剑指 offer:二进制中1的个数
- 剑指offer-二进制中1的个数
- Core Animation
- UVa 1395 - Slim Span(MST)
- 一行命令搞定node.js 版本升级
- HTML中引入资源相对路径
- mac unix 下使用 scp 命令
- 剑指Offer系列---(13)二进制中1的个数
- K-means聚类算法
- Codeforces 479D Long Jumps (set + 迟取法)
- 安卓对比苹果开发
- AOP入门二
- jquery封装 [ 限制文本框只能输入数字和小数] 语句,简单调用即可
- maven链接接口
- maven -tomcat 插件如何修改端口和虚拟目录
- Asp.Net 密码加密技术