操作符习题练习

#####写一个函数返回参数二进制中 1 的个数

比如: 15 0000 1111 4 个 1


看到这个题目,首先可以想到十进制数模2可以得到它的二进制数,所以可以用循环,然后模2,就可以得到二进制数里面的1,然后定义一个计数器count,则可以判断1的个数.代码如下:

#include<stdio.h>
int main()
{
int num=15;
int count=0;
while(num)
{
	if(num%2==1)
		count++;
	num = num/2;
}
printf("%d\n", count);
	return 0;
}

但是当你运行时,你会发现这个代码也是有缺陷的,如果给num赋值一个负数,while循环将不能循环,所以可以采用下面的方法,直接用二进制进行运算,操作符的知识点梳理里面可以看到 一位二进制数按位与1则可以得到它的最低位。
然后发现num按位与(num-1)得到的结果是把它二进制数的最后一位去掉了,然后把按位与的值再赋给num,再与(num-1)按位与,直到num最后为0
.所以可以参考下面的代码,即用到了函数

#include<stdio.h>
int count_one_bit(unsigned int n)
{
int count = 0;
 while(n)
{
if(n%2 == 1)
    count++;
n=n/2;
}
while(n)
{
 n = n&(n-1);
 count++;
 }
return count;
}

      int main()
{
    int num = -1;
int ret = count_one_bit(num);
printf("ret = %d\n", ret);
      return 0;
      }

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


一个整型是4个字节,32个比特位,所以可以按奇偶数排列写两个循环来输出
输出时随着循环右移,然后 按位与 1 则可以得到序列了

#include<stdio.h>
int main()
{
int num=112323;
	int i=0;
	for(i=31;i>=1;i-=2)
	{
		printf("%d ",(num>>i)&1);
	}
	printf("\n");
	for(i=30;i>=0;i-=2)
	{
		printf("%d ",(num>>i)&1);
	}
	
	system("pause");
	return 0;
}       

#####两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?


因为要比较有多少个位不同,所以可以想到异或,相同为0,不同为1
然后异或出来的结果再用循环,数出 1 的位数

#include<stdio.h>
int main()
{
	int m=1999;
	int n=2299;
	int count=0;
	int i=m^n;
	while(i!=0)
	{
		i=i&(i-1);
		count++;
	}

	printf("%d",count);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/79721691