思路:0 ^ n = n 、n ^ n = 0、通过异或算出最后的结果,1^2^3^4^5^1^2^3^4相当于1^1=0、2^2=0、3^3=0、4^4=0、结果就为5
cpp复制代码
#include <stdio.h>
int f(int arr[], int len)
{
int ret = 0;
int i = 0;
for (i = 0; i < len; i++)
{
ret ^= arr[i];
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int len = sizeof(arr) / sizeof(arr[0]);
int dog = f(arr, len);
printf("%d\n", dog);
return 0;
}
交换两个变量(不创建临时变量)
不允许创建临时变量,交换两个整数的内容
方法一
思路:通过异或交换
cpp复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//不允许创建临时变量,交换两个整数的内容
int main() {
int a = 5;
int b = 1;
//0101^0001
a = a ^ b;//0100 4
//0100^0001
b = a ^ b;//0101 5
//0100^0101
a = a ^ b;//0001 1
return 0;
}
方法二
思路:通过加减法交换
不推荐,可能会整数溢出,因为整数较大时a+b可能会超出整数的范围
cpp复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//不允许创建临时变量,交换两个整数的内容
int main() {
int a = 5;
int b = 1;
a = a + b;
b = a - b;
a = a - b;
return 0;
}
int NumberOf1(int n) {
// 15 0000 1111 4 个 1
int count = 0;
unsigned int un = (unsigned int)n;
while (un != 0) {
if (un % 2 == 1) {
count++;
}
un = un / 2;
}
return count;
}
方法二
方法一效率低
思路: 一个int类型的数据,对应的二进制一共有32个比特位,可以采用位运算的方式一位一位的检测
cpp复制代码
int NumberOf1(unsigned int n)
{
int count = 0;
int i = 0;
for(i=0; i<32; i++)
{
if(((n>>i)&1) == 1)
count++;
}
return count;
}
方法三
方法二效率也低,因为每回都要循环32次
思路:用相邻的两个数据进行按位与运算
cpp复制代码
int NumberOf1(int n)
{
int count = 0;
while(n)
{
n = n&(n-1);
count++;
}
return count;
}
打印整数二进制的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
思路:打印相应位数的数,一个二进制通过右移再&1
cpp复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
void NumberOf1(int n) {
printf("偶数位");
for (int i = 31; i >= 1; i -= 2) {
printf("%d", (n >> i) & 1);
}
printf("\n");
printf("奇数位");
for (int i = 30; i >= 0; i -= 2) {
printf("%d", (n >> i) & 1);
}
}
int main() {
int n = 0;
scanf("%d", &n);
NumberOf1(n);
return 0;
}