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\n", a, b);
	a = a + b; 
	b = a - b;
	a = a - b;
	printf("交换之前:a=%d, b=%d\n", a, b);
	return 0;
}

 这种方法能虽然能解决这个问题,但是有一个很大的问题,那就是如果这两个数都特别大,相加之后会越界的数,这时就会出问题了,比如32位系统存储一个整数是4个字节

11111111  11111111  11111111   11111111  = 4,294,967,295。这就是32位整型能存储的最大的数了,都是1.一旦和超过了这个数,结果就变的不准确了,当然如果你用不到这么大的数,那就无所谓了。我们写程序还是要保险一些的好。所以就有了另外一种方法:

 

扫描二维码关注公众号,回复: 15606735 查看本文章
int main()
{
	int a = 2;
	int b = 3;
	printf("交换之前:a=%d, b=%d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换之前:a=%d, b=%d\n", 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\n", i, a >> i);
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

好了,今天到此为止,学习了这么多,也该休息一下了。

猜你喜欢

转载自blog.csdn.net/xingyuncao520025/article/details/131181128