求int型正整数在内存中存储时1的个数
题目描述:
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
输入例子:
5
输出例子:
2
方法一:
计算机保存数据就是2进制的,如char a = 97;那么在计算机里面的信息就是01100001,用2进制打印就是01100001,用10进制打印就是97,因此只存在显示方式的不同。
c语言中对位操作有几种方式,&与操作,|或操作,^异或操作,~反操作,<<左移位操作,>>右移位操作。
如果想取a的第i位是多少,表达式(a & (1 << i))为0表示第i位为0,非0表示第i位为1。
1 #include <iostream> 2 using namespace std; 3 #define LEN 32 4 5 int main(){ 6 int i; 7 cin>>i; 8 int counter = 0; 9 int len = LEN; 10 while(len--){ 11 if(i&(1<<len)) 12 counter++; 13 } 14 cout<<counter<<endl; 15 16 return 0; 17 }
方法二:
数字在内存中 ,被转化为二进制。
例如7表示为0111
n&(n-1) 即(0111)&(0110)== 0110 就是 n去除了最后一个1 ;
几个1 就可以在几次内 去除几个1;
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int n; 5 cin>>n; 6 int counter=0; 7 while(n){ 8 n=n&(n-1); 9 counter++; 10 } 11 cout<<counter<<endl; 12 return 0; 13 }
方法三:
利用bitsetA bitset stores bits (elements with only two possible values: 0 or 1,
true
or false
, ...).
1 #include <iostream> 2 #include <bitset> 3 4 using namespace std; 5 6 int main(){ 7 int i; 8 cin>>i; 9 bitset<32> bt(i); 10 cout<<bt.count()<<endl; 11 }