求 int型数据补码中1的个数
//int数据补码中1的个数
#include<stdio.h>
#include<math.h>
int main() {
long long int n;
int x;
while(scanf("%d",&x)!=EOF) {
int count=0;
if(x==0)
continue;
else if(x<0) {
n=x+pow(2,32);
}
for(int i=0;i<32;i++){
if((n>>i)&1)//右移运算符判断末尾是否为1
count++;
}
printf("%d ",count);
}
return 0;
}
32bit的unsigned型数据每4bit 为一组拆为8个unsigned int 型数据
#include <iostream>
using namespace std;
int main() {
unsigned a=16,b;
for(int i=0;i<=28;i+=4){
b=(a>>i)&15;//15的二进制位1111
cout<<b<<endl;
}
return 0;
}
计算x的二进制中1的位数
&代表与运算,把x和x-1换算成二进制,然后逐位运算,在两个操作数中都有的0或1照抄下来,就是与运算的结果。
更为特殊一点,x&(x-1)就是把x的二进制-1,或者说把x的二进制最后一个1变成0。
#include "stdafx.h"
#include<iostream>
using namespace std;
int func(int x)
{
int count = 0;
while (x)
{
count++;
x = x&(x - 1);
}
return count;
}
int main()
{
cout << func(2015) << endl;
return 0;
}