您现在的位置是:首页 >技术教程 >C语言交换两个变量的值,不能使用第三个变量。网站首页技术教程
C语言交换两个变量的值,不能使用第三个变量。
简介C语言交换两个变量的值,不能使用第三个变量。
今天学习了一个新的方法,感觉有必要记录一下,免得自己忘记。
问题是:交换两个变量的值。不能使用第三个变量。
我们正常的做法是:比如有变量a=2,变量b=3,我们创建变量c,把a的值放到c里面,再把b的值放到a里面,最后把c的值放到b里面,就完成了。
c=a;a=b;b=c,进过这三步就能把这个问题解决了,但是现在的要求是不能使用第三个变量c,要怎么来完成交换呢?
有两种方法来解决,先来看第一种方法:
int main()
{
int a = 63;
int b = 49;
printf("交换之前:a=%d, b=%d
", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("交换之前:a=%d, b=%d
", a, b);
return 0;
}
这种方法能虽然能解决这个问题,但是有一个很大的问题,那就是如果这两个数都特别大,相加之后会越界的数,这时就会出问题了,比如32位系统存储一个整数是4个字节
11111111 11111111 11111111 11111111 = 4,294,967,295。这就是32位整型能存储的最大的数了,都是1.一旦和超过了这个数,结果就变的不准确了,当然如果你用不到这么大的数,那就无所谓了。我们写程序还是要保险一些的好。所以就有了另外一种方法:
int main()
{
int a = 2;
int b = 3;
printf("交换之前:a=%d, b=%d
", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换之前:a=%d, b=%d
", a, b);
return 0;
}
这种异或的交换方法就没有什么隐患了,不存在越界的可能性了。
另外在写一个:求一个整数在内存中的二进制中1的个数?
比如整数3,内存中二进制存法是11, 1的个数就是2个.
其实这个实现也没有什么难度,就是最后一位和1与&结果是1,就证明二进制中是1.
// 求一个整数存储在内存中的二进制中1的个数?
int main()
{
int a = 36987;
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (a >> i & 1)
{
printf("i=%d %d
", i, a >> i);
count++;
}
}
printf("%d", count);
return 0;
}
好了,今天到此为止,学习了这么多,也该休息一下了。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。