1.写一个函数返回参数二进制中 1 的个数;
2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列;
3. 输出一个整数的每一位;
4.编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?(剖析:即为统计两个数异或(相同为0,不同为1)后1的个数。
#include<stdio.h>
#include<windows.h>
int count_one_bits(unsigned int value)
{
int count = 0;
//方法1
//while(value){
// if(1 == value%2)//始终判断最低位1 * 2 ^ 0 = 1
// {
// count++;
// }
// value /= 2;//从低位判断依次向高位移动
//}
//方法2
//while(value){
// if(value&1)//右移将原始高位都移到最低位,与1相与判断最低位
// {
// count++;
// }
// value >>= 1;
//}
//方法3(学习版)
while(value){
count++;
value &= value-1;//与本身-1相与,可以每次消去较低位的1
}//3:0011 & 2:0010 = 2:0010 & 1:0001 = 0:0000 结果为2
return count;
}
void bin_even_odd(int value ,int arr[32]){
int i = 0;
for(; i < 31; i+=2){
arr[i] = value>>i&1;
}
for(i = 1; i < 32; i+=2){
arr[i] = value>>i&1;
}
}
void bin_every(int value){
int i = 31;
for(; i >= 0; i--){
printf("%d",value>>i&1);
}
printf("\n");
}
//4.方法1
int compare_bin_difference(int m, int n){
int i = 0;
int count = 0;
/*int high_bit = 0;
int max=m > n? m: n;
for(i = 31; i >= 0; i--){
if(max>>i&1){
high_bit = i;
break;
}
}*/
for(i = 0; i <= 32; i++){//high_bit
if((m>>i&1) != (n>>i&1)){
count++;
}
}
return count;
}
int main()
{
/*int arr[32] = {0};
int i,j;*/
int m = 0;
int n = 0;
/*int value;
scanf("%d",&value);*/
scanf("%d%d",&m,&n);
//printf("%d\n",count_one_bits(value));
/*bin_even_odd(value ,arr);
printf("偶数位为:\n");
for(i = 0; i < 31; i+=2){
printf("%d ",arr[i]);
}
printf("\n奇数位为:\n");
for(i = 1; i < 32; i+=2){
printf("%d ",arr[i]);
}
printf("\n");*/
//bin_every(value);
//printf("%d\n",compare_bin_difference(m, n));
//4.方法2:可以理解为求解两个数异或后位为1的个数,即为不同的位数
printf("%d\n", count_one_bits(m ^ n));
system("pause");
return 0;
}