##写一个函数返回参数二进制中 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;
}