操作符的运用

小碗装醋

假如现在你的面试官给你出了一道题,让你交换两个变量,你肯定会想,这还不简单?直接使用小碗装醋法秒了。

int a = 3;
int b = 5;
int c = 0;//中间变量
c = a;//把a装到c中
a = b;//把b装到a中
b = c;//再把刚刚装入c中的a转到bz=中。

此时ab的值就从35变成我们最爱的53了。你以为已经大功告成了,谁知面试官不当人,看你这么快解决问题,便不允许你使用第三个变量(中间变量),直接把你第三只碗给摔了,这时,你又该怎么办呢?此时你可能会想到这种方法:

a = a + b;
b = a - b;//相当于a+b-b=a,把a值赋给了b。
a = a - b;//相当于a-(a-b)=b,把b值赋给了a。

"左右互搏术",当你正在为自己的聪慧感到沾沾自喜时,面试官却又说:如果a和b的值加起来的值溢出该怎么办?你强忍着心中的怒火,想起来你刚刚学习的按位异或操作符^。给出了如下解法:

int a = 1;
int b = 2;
a = a^b;//a变成11即为3
b = a^b;//b变成01即为1,把原a值赋值过来了
a = a^b;//a变成02即为2,把原b值赋值过来了

面试官看到后大大夸奖了你一番。

位操作符与左右移操作符

上述操作的实现得益于计算机的二进制计算,按位异或操作符"^"会将两数字的二进制表达式的每一位进行比较,数字相同则为0,数组相异则为1。除此之外还有按位与操作符“&”、按位或操作符"|"、按位取反操作符"~"。接下来对其进行简单的概括:

"&":二进制位中数字同1则1,否则为0;

"|":二进制位中数字有1则1,无1为0;

”~“:将二进制位中所有数字取反,包括首位决定正负的数字。

"<<"与">>"左移与右移操作符。

左移补位0,右移补位决定正负的数字。

于是,我们可以解决下面的问题:

操作符的运用_第1张图片

想要求1的个数,我们天然想到把每一位数都判断一遍:

int Fun(unsigned int n)
{
	int count = 0;
	int i = 0;
	for(i=0; i<32; i++)
	{
		if(((n>>i)&1) == 1)
			count++;
	}
	return count;
}

判断完一个数后向右移动一位,再继续判断,像这样重复12次,这种方法用到了右移操作符。除此之外,我们还可以这样:

int Fun(int n)
{
	int count = 0;
	while(n)
	{
		n = n&(n-1);
		count++;
	}
	return count;
}

我们进行逐一分析发现,代码会从右向左把数字的每一位变成0,最后跳出循环,而每次替换,count就会加一,这样也可以完成任务。

----------------------------------------------------------EOF-----------------------------------------------------------------

你可能感兴趣的:(开发语言,c语言,算法)