不能创建临时变量,实现两个数的交换
- 方法一:
#include<stdio.h>
int main()
{
int a=10;
int b=20;
a=a+b;//1
b=a-b;//2
a=a-b;//3
printf("a=%d b=%d\n",a,b);
return 0;
}
思路介绍:
- 将
a+b
赋值给a
a-b
的值就为a
,赋给b
- 最后一个
a-b
的值就为b
,在赋给a
,完成a,b值的交换
- 方法二:
#include<stdio.h>
int main()
{
int a=10;
int b=20;
a=a^b;//1
b=a^b;//2
a=a^b;//3
printf("a=%d b=%d\n",a,b);
return 0;
}
思路介绍:
- 思路一:
1
00000000 00000000 00000000 00010100----a
00000000 00000000 00000000 00001010----b
00000000 00000000 00000000 00011110----a=a^b
2
00000000 00000000 00000000 00011110----a
00000000 00000000 00000000 00001010----b
00000000 00000000 00000000 00010100----b=a^b
3
00000000 00000000 00000000 00011110----a
00000000 00000000 00000000 00010100----b
00000000 00000000 00000000 00001010----a=a^b
最终实现a,b值的交换
- 思路二:
因为a=a ^ b
,所以b=a ^ b ^ b
,又因为b ^ b=0
,所以b=a
;
因为a=a ^ b
,b=a
,所以a=a ^ b ^ a
,又因为a ^ a=0
,所以a=b
。
求一个整数存储在内存中的二进制1的个数
思路:
我们可以利用位移操作符(<<,>>,~),利用循环不断将1往左移动,再将移动后的1与这个整数与起来,若与起来的数为1,则计数器+1。由此得到以下代码:
- 方法一
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for (i = 0; i<32; i++)
{
if (num & (1 << i))
count++;
}
printf("%d的二进制中1的个数 = %d\n",num, count);
return 0;
}
但是该程序还需进行32次,还可进行优化。
- 方法二:
#include <stdio.h>
int main()
{
int a = -1;
int num = a;
int i = 0;
int count = 0;//计数
while (num)
{
count++;
num = num&(num - 1);
}
printf("%d的二进制中1的个数 = %d\n",a,count);
return 0;
}
思路:
num = num&(num - 1)
会将num中的最右边的一位1变为0,由此程序最重要的部分已经完成,只需配合while循环以及计数器count的使用,便完成了。
判断一个数是否为2的n次方
思路:
该题的思路边和上面的一个思路相同,利用num = num&(num - 1)
去除num中最右边的一个1,由于2^n的二进制只有一位1,所以在执行一次后num便会为0。由此得到以下代码:
#include <stdio.h>
int main()
{
int num = 0;
while (scanf("%d", &num) != EOF)
{
if ((num & (num - 1)) == 0)
{
printf("%d是2的n次方\n",num);
}
else
{
printf("%d不是2的n次方\n",num);
}
}
return 0;
}