Solution 28: 整数中1的个数

问题描述

输入1个整数,求其二进制表示中有多少个“1”。

解决思路

1. 不断右移,碰到1与0与,计数;(对于负数不可,会死循环);

2. 与(n-1)与,相当于清除最右端的“1”,计数。

程序

思路2:

public class NumOfOne {
	public int getNumOfOne(int num) {
		int count = 0;
		while (num != 0) {
			num = num & (num - 1);
			++count;
		}
		return count;
	}
}

  

时间: 2024-10-10 21:36:48

Solution 28: 整数中1的个数的相关文章

整数中1 的个数

问题 求整数中1的个数 原理 一个数n若不为0,从数的最低为到最高位,第一个为1 的位记为 i ,则减去 1 之后,改为变为0,i 右边的所有位都变为1,因此 n & (n-1)可得 n中剩余比 i 更高位序 的 部分 ,循环此操作,则可得 1 的计数. 代码 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n,s,counter = 0; 7 cout << " Plea

求出整数中1的个数

输入一个整数,求出它的二进制1的个数.考虑的知识点:负数怎么求,因为计算机中存放都是补码的形式存储一个数.因为正数的源码,反码,补码都是一样,不用考虑.但是负数就要考虑了,比如-0,它的源码应该是10000000 00000000 00000000 000000000 00000000,所以负数要考虑. 下面是代码实现: #ifndef _FINDNUMBEROF1_ #define _FINDNUMBEROF1_ /*================================ Macro

nyoj 222 整数中的1个数以及这类问题

之前也写过一篇这样的文章,但是隔了这么久,竟然忘了.还是要有清晰的思路,才能真正的掌握. 这道题是这样的: 给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总个数. 分析:为的是求2进制中1的个数.从0-15的二进制如下: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 第一位的1,每隔2就出现.第二位的1,每隔4出现2次.第三位的1,每隔8出

统计整数中1的个数

题目:给定一个无符号整数x,求x的二进制表示中1的个数. 分析: 看到二进制,基本上就各种位运算的骚操作吧. 算法一: 最容易想到的,不断除2,并进行统计. 算法二: 如果已知大多数数据位是 0 的话,那么还有更快的算法,这个算法基于一个事实:x&(x-1)会消掉最后一个1. 算法三: 分治法,均分成两半,1的个数=左边1的个数+右边1的个数. #include<bits/stdc++.h> using namespace std; typedef unsigned int uint;

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

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: n &(n-1)把n的最右边的1去掉,用count++计算1的个数  eg: 101 & 100 = 100   1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count = 0; 5             while(n!=0){ 6                 count++; 7                 n = n&

剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)

1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位为1.每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1.unsigned int flag = 1; 3. C++核心代码 3.1 位运算 1 class Solution { 2 public: 3 int NumberOf1(int

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

求从1到500的整数中能被3和5整除但不能被7整除的数的个数

     设为1到500的整数中能被i整除的数的集合,, 则,,, ,,, ,      满足条件的整数个数为:,根据容斥原理有:         我知道是容斥原理,关键是不知道最后一个公式,用两个集合想想韦氏图就行了.

求整数范围中1的个数

一.解法 1 public int NumberOf1Between1AndN_Solution(int n) { 2 int ones = 0; 3 for (long m = 1; m <= n; m *= 10){ 4 long a = n/m, b = n%m; 5 //对应位置>=2的时候 //对应位置为1的时候 6 ones += (a+8)/10*m +((a%10 == 1)? (b+1):0); 7 } 8 return ones; 9 } 二.思路 1.我们每次分别求个位,