1.五种问题:
1.单身狗问题
2.打印整数二进制中的奇数位和偶数位
3.交换两个变量
4.统计二进制中1的个数
5.求两个数二进制中不同的个数
1.单身狗问题:(异或操作符:0^x=x,x^x=0)
在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。
例如:
数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//异或操作符的应用
int main()
{
int ret=0,arr[] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
ret^=arr[i];
}
printf("%d", ret);
return 0;
}
2.打印整数二进制中的奇数位和偶数位:(位移操作符和按位与操作符,0&1=0,1&1=1,x与1按位与得x)
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n, i;
n = 5;
//奇数位
for (i = 30; i >= 0; i=i-2)
{
printf("%d", (n >> i) & 1);
}
printf("\n");
for (i = 31; i >= 1; i=i - 2)
{
printf("%d", (n >> i) & 1);
}
return 0;
}
3.交换两个变量(运用三次异或操作符)
不允许创建临时变量,交换两个整数的内容
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d,b=%d", a, b);
return 0;
}
4.统计二进制中1的个数
写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
int NumberOf1(int n )
{
int i,count=0;
for(i=0;i<32;i++)
{
if(((n>>i)&1)==1)
{
count++;
}
}
return count;
}
5.求两个数二进制中不同的个数
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#include<stdio.h>
int main()
{
int a, b, i, count = 0;
scanf("%d%d", &a, &b);
for (i = 0; i < 32; i++)
{
if ((((a >> i) ^ (b >> i)) & 1) == 1)
count++;
}
printf("%d", count);
}