2017-11-21 test6

##写一个函数返回参数二进制中 1 的个数
####fun1: 模2除2法
####fun2: 右移(按位与1)法
####fun3: (按位与i-1)法


#define _CRT_SECURE_NO_WARNING 1 
#include<stdio.h>
int fun1(unsigned int i){    //这里的unsigned将负数的首位二进制数当做数值参与运算
	//当i不为0时(说明其二进数补码中一定有1)执行循环(循环中每除一次2,可视作右移一位),循环内判断i%2是否为1,为1记录下来,最后返回记录次数。
	int count = 0;
	while (i!=0){
		if (i%2 == 1){
			count ++;
		}
		i=i/2;
	}

		return count;
}
	
int fun2(unsigned i){
	//当i不为0执行循环,循环内让i补码按位与1的补码,判断其末尾是否为1,在令i右移一位(效果等同于除以2)
	int count = 0;
	while (i){
	if ((i&1) == 1){
		count++;
	}
	i/=2;
	}
	return count ;
}

int fun3(unsigned i){
	//当i不为0时执行循环,循环内令i按位与i-1(按位与只有补码同一位同时为1时取1,其余均取0,所以只要i不为0,每次循环一定会不断的减少1的个数),最后返回循环的次数。
	int count = 0;
	while (i){
		i=i&(i-1);
		count ++;
	}
	return count ;
}

int main(){
	
	int input=0;
	int output=0;
	printf("请输入一个整数,系统将返回其补码中1的个数:\n");
	scanf("%d",&input);
	output = fun1(input);
	printf("该数的补码中1的个数为%d\n\n",output);
	output = fun2(input);
	printf("该数的补码中1的个数为%d\n\n",output);
	output = fun3(input);
	printf("该数的补码中1的个数为%d\n\n",output);

return 0;
}

###获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 
int fun(int i){
	int j=1;
	int num=i;
	char ch1[16]={0};    //要输出的奇数位 二进制序列
	char ch2[16]={0};    //要输出的偶数位 二进制序列
	for (j=0;j<16;j++){       //统一先对奇数位操作
		if ((num&1) == 1){     //末位为1
			ch1[j] = 1;
		}
		else {
			ch1[j] = 0;        //末位为0
		}
	   num >>=2; 
	
	}
	num=i;             //此时num已经为0,需要重新赋值
	num>>=1;           //让num先右移一位,从第二位开始操作
for (j=0;j<16;j++){                
		if ((num&1) == 1){
			ch2[j] = 1;       //末位为1
		}
		else {
			ch2[j] = 0;       //末位位0
		}
		num >>=2;     
		
	}
	printf("该数奇数位二进制序列为:\n");
	for (j=15;j>=0;j--){
		printf("%2d",ch1[j]);
	}
	printf("\n");
	printf("该数偶数位二进制序列为:\n");
	for (j=15;j>=0;j--){
		printf("%2d",ch2[j]);
	}
	return 0;
	}



	int main(){
		int b=0;
		scanf("%d",&b);
		fun (b);
		return 0;
	}

输出一个整数的每一位。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void fun(int i){
	//i不为0是,i对10取余,即是个位上的数字,用i对10的模继续循环,依次得到每一位的值.
	while (i){
		printf("%d\t",i%10);
		i /= 10;
	}
}
int main(){
	int a = 0;
	scanf("%d",&a);
	fun (a);
	return 0;
}

###编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void fun(int i,int n){
     int u=0;
	 int count =0;
	 for (u=0;u<32;u++){        
		 if ((i&1) == (n&1)){
			 count ++;
		 }
		 i>>=1;
		 n>>=1;
	 }
	 printf("共有%d位不同\n",32-count);
}
		 
int main(){
     int a = 0;
	 int b = 0;
     scanf("%d%d",&a,&b);
	 fun (a,b);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值