【c语言练习】新手必会操作符练习(& | ^ ~ >>) 不讲废话!简洁易看!(所有题目只用最简解法)

虽然只有4题!但绝对精品!!

1.单身狗

题目分析:

思路:

具体代码:

运行结果: 

2. 统计二进制中1的个数

思路:

 具体代码:

运行结果: 

3.分别输出一个数的二进制中的偶数和奇数二进制序列

思路:

具体代码: 

运行结果:

4.求两个数的二进制有几位不同的

题目分析:

思路:

具体代码:

运行结果:

总结


1.单身狗

题目分析

找出数组1,2,3,4,5,1,2,3,4中的单身狗,单身狗是指数组中的只出现过一次的数字。

思路:

n^n=0   n^0=n

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int func(int arr[], int len)
{
	int ret = 0;
	for (int i = 0; i < len; i++)
	{
		ret ^= arr[i] ;
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,4,3,2,1 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int ret=func(arr, len);
	printf("%d", ret);
	return 0;
}

运行结果: 

 

2. 统计二进制中1的个数

思路:

 n = n & (n - 1) 每进行一次使得n的二进制最右边的1消失

 具体代码:

本题以具体数字7(0000 0111)为例(咳咳随便写的数字,你想其他的数字也行)

int main()
{
	int a = 7;
	int count = 0;
	while(a!=0)
	{ 
		a = a & (a - 1);
		count++;
	}
	printf("%d", count);
	return 0;
}

运行结果: 

3.分别输出一个数的二进制中的偶数和奇数二进制序列

思路:

n & 1   得到某个数n的二进制最后一位(是1或0)
n >> 1  n向右平移一位

一个数n有32个比特位

(从右往左)偶数是从第30个开始,分别让偶数位右移到n的二进制最后一位

(如左边第一位偶数用(n>>30)&1 )


同理,(从右往左)奇数是从第31个开始,分别让奇数右移到n的二进制最后一位

(如左边第1位奇数的用(n>>31)&1  )

具体代码: 

别管,我爱7嘻嘻,还是以具体数字7(0000 0111)为例子。

int main()
{
	int a = 7;
	//偶数序列
	for (int i = 30; i >= 0; i -=2)
	{
		printf("%d", (a >> i) & 1);
	}

	printf("\n");

	//奇数序列
	for (int j = 31; j >= 1; j -= 2)//注意这里奇数最后一位的i是处在1的位置
	{
		printf("%d", (a >> j) & 1);
	}
	return 0;
}

运行结果:

4.求两个数的二进制不同位的个数

题目分析:

如7(0000 0111)和 15(0000 1111),这俩数只有1位二进制位上的数不同

思路:

算是一个小综合了,结合了以上好几道题的思路

两个数m和n
m ^ n  可以得到两个数不同的位数(这个数设为a)
a & (a-1)  统计a中1的个数

具体代码:

int main()
{
	int m = 7;
	int n = 15;
	int a = m ^ n;//此时a上的是1的位数就是这两个数不同的二进制位
	int count = 0;//用来计数的

	while (a)
	{
		a &= (a - 1);
		count++;
	}
	printf("%d", count);

	return 0;
}

运行结果:

 

总结

这4题都能摸透,那你对操作符的掌握可谓炉火纯青啦 

恭喜你哦~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值