C语言操作符经典题目(一只单身狗、两只单身狗)

 

目录

1、获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

2、一个数组中只有一个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这一个只出现一次的数字。(一只单身狗) 

3、一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。(两只单身狗)


1、获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

思路:

1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0 

2. 以同样的方式提取偶数位置

 检测num中某一位是0还是1的方式:

1. 将num向右移动i位

2. 将移完位之后的结果与1按位与,如果:

结果是0,则第i个比特位是0;结果是非0,则第i个比特位是1

#include

void Printbit(int num)
{
	for(int i=31; i>=1; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	printf("\n");
    
	for(int i=30; i>=0; i-=2)
	{
		printf("%d ", (num>>i)&1);
	}
	printf("\n");
}

2、一个数组中只有一个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这一个只出现一次的数字。(一只单身狗) 

思路:对数组中的数进行异或。先跟0异或,任何数跟0异或都等于这个数本身。两个相同的数异或的结果为0,异或满足交换律,所以异或到最后剩下的数就是只出现了一次的那个数。

#include 
int main()
{
	int arr[20] = { 1,2,3,4,5,1,2,3,4 };
	int size = sizeof(arr) / sizeof(arr[0]);
	int ret = 0;
	for (int i = 0; i < size; i++)
	{
		ret ^= arr[i];
	}
	printf("单身狗是:%d", ret);
	return 0;
}

 

C语言操作符经典题目(一只单身狗、两只单身狗)_第1张图片

3、一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。(两只单身狗)

思路:

1.将数据分成两组异或(异或满足交换律),分别找出每一组的单身狗
2.分组:将数组中每一个元素异或,得到两个单身狗的异或值
两个单身狗异或的二进制中一定有1,找到这个位置,数组中这个位置为1的为一组,为0的为一组
3.分别异或 

#include

int main()
{
	int arr[20] = { 1,2,3,4,5,1,2,3,4,9 };
	int size = sizeof(arr) / sizeof(arr[0]);
	int ret = 0;
	for (int i = 0; i < size; i++)
	{
		ret ^= arr[i];
	}
	//ret是5和9的异或值
	int pos;//5和9按位异或后二进制中第一个不同的位置
	for (int i = 0; i < 32; i++)
	{
		if ((ret >> i) & 1 == 1)
		{
			pos = i;
		}
	}

	int sum1 = 0;
	int sum2 = 0;
	for (int i = 0; i < size; i++)
	{
		if (arr[i] >> pos == 1)
		{
			sum1 ^= arr[i];
		}
		else
		{
			sum2 ^= arr[i];
		}
	}
	printf("%d %d\n", sum1, sum2);
	return 0;
}

C语言操作符经典题目(一只单身狗、两只单身狗)_第2张图片 

 

你可能感兴趣的:(#,C语言,c语言)