虽然只有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题都能摸透,那你对操作符的掌握可谓炉火纯青啦
恭喜你哦~