c回顾之day6

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;
}

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/79810162