求int型数据在内存中存储时1的个数

1.求int型数据在内存中存储时1的个数

输入一个int型数据,计算出该int型数据在内存中存储时1的个数。

我们非常easy想到例如以下方法:

#include <iostream>
using namespace std;
int main()
{
	int n,cnt=0;
	cin>>n;
	while(n)
	{
		if(n%2==1)
			cnt++;
		n=n/2;
	}
	cout<<cnt<<endl;

	return 0;
}

在对代码进行測试时输入负数无法得出结论。以下的方法将解决这一问题。

#include <iostream>
using namespace std;
int GetCount(int n)
{
	int m=0;
	while(n)
	{
		n&=(n-1);
		m++;
	}
	return m;
}
int main()
{
	int a;
	cin>>a;
    cout<<GetCount(a)<<endl;
}

假设我们把这个整数减去1,那么原来处在整数最右边的1就会变成0。原来在1后面的全部 的0都会变成1。其余的全部位将不受到影响。

举个样例:一个二进制数1100,从右边数起的第三位是处于最右边的一个1。减去1后。第三位变成0,它后面 的两位0变成1,而前面的1保持不变,因此得到结果是1011。

我们发现减1的结果是把从最右边一个1開始的全部位都取反了。这个时候假设我们再把原来的整数和减去1之后的结果做与运算。从原来整数最右边一个1那一位 開始全部位都会变成0。如1100&1011=1000。

也就是说,把一个整数减去1。再和原整数做与运算,会把该整数最右边一个1变成0。那么 一个整数的二进制有多少个1。就能够进行多少次这种操作。

比如上面中-10,在32位机中表示为1111111111111111 1111111111110110,所以1的个数为30.

时间: 2024-12-28 20:37:46

求int型数据在内存中存储时1的个数的相关文章

(一)求 int 型数据在内存中存储时 1 的个数

题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入:输入一个整数(int 类型) 输出:这个数转换成2进制后,输出 1 的个数 1 #include <stdio.h> 2 3 int GetCount(int num) 4 { 5 /* 功能实现 */ 6 int ret = 0; 7 8 while (num) 9 { 10 num &

[NewCoder]求int型正整数在内存中存储时1的个数

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数  输入例子:5  输出例子:2 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int num = 0; S

015-求int型数据在内存中存储时1的个数

/* 015-求int型数据在内存中存储时1的个数 题目描述 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 输入描述:  输入一个整数(int类型) 输出描述:  这个数转换成2进制后,输出1的个数 输入例子: 5 输出例子: 2 */ //c语言版 #include <stdio.h> int main(void) { int integer,i; int count = 0; scanf("%d",&integer); unsigned u

华为OJ-求int型数据在内存中存储时1的个数

1 #include <iostream> 2 using namespace std; 3 int GetCount(int num) 4 { 5 int m=0; 6 while(num) 7 { 8 num &=(num-1); 9 m++; 10 } 11 return m; 12 } 13 int main() 14 { 15 int a; 16 cin>>a; 17 cout<<GetCount(a)<<endl; 18 } 原文地址:h

输入一个int型数据,计算出它在内存中存储时含1的个数

/******************************************************** 输入一个int型数据,计算出它在内存中存储时含1的个数 比如: 输入:5 输出:2 ********************************************************/ #include<iostream> int CountOne(int num) { int count = 0; while(num){ count++; num = num&am

求int型数组和最大子数组 续

之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序  当子数组所含元素值超过int型数组取值范围时,会出现什么情况? 实现: 在接触到这个问题之前,肯定的说,我从来没有考虑过这个问题,不是自己不知道int型数值的取值范围,而是自己根本没有注意过这个问题,也没有想过数的取值会超过这个范围.知道这个“问题”后我做了下面的事情: a.和同学借组,查阅相关资料,了解

计算int 型数值在内存中二进制1的个数

今天在华为OJ上遇到这么一个题目,很简单,但是却总是得不到最好的成绩记录.因此比较了自己的程序.思路与别人的异同,发现还是有很大区别的,遂记录如下. 题目-- 输入一个int型整数,求该整数的二进制在内存中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 思路1 <span style="font-size:18px;">public static void main(String[] args) { Scanner scanner = new

整型数据在内存中的存放形式

整型数据在内存中是以其二进制的补码的形式存放的! 1.原码 就是以最高位作为符号位,0代表该数值为正,1代表为负! 比如:67和-67 2.反码 正数的原码.反码.补码相同! 负数的反码是在其符号位不变的基础之上,其余的数值位按位取反,就是0变成1,1变成0 3.补码 正数的原码.反码.补码相同! 负数的补码是其反码加1! 也就是说,在内存中,67其实存放的就是: 00000000 00000000 00000000 01000011 而-67其实存放的就是: 11111111 11111111

浮点数如何在内存中存储

首先,将10进制的小数0.1转换为二进制,方法如下: 0.1*2==0.2  取0.2的整数部分, 结果为0.0 0.2*2==0.4  取0.4的整数部分, 结果为0.00 0.4*2==0.8  取0.8的整数部分, 结果为0.000 0.8*2==1.6  取1.6的整数部分, 结果为0.0001 0.6*2==1.2  取1.6的整数部分, 结果为0.00011 0.2*2==0.4  取0.4的整数部分, 结果为0.000110 最后这一步开始循环,因此0.1的二进制为数为: 0.00