《C语言入门100例》 (第三例)数值交换
一、习题求解
1、题目(来自leetcode)
- 编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
2、源码实现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
numbers[0] ^= numbers[1]; //(1)
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
*returnSize = numbersSize;//(2)
return numbers;
}
下面解释上面的代码
(1)
这里使用的是位运算符和赋值运算符的结合
位运算符:这是C语言提供的能够操作二进制数的操作符号,分别是
^
、~
、|
、&
、<<
、>>
六种操作运算符。这里我们暂时先介绍前四种逻辑运算符。使用这些运算符时请注意这些操作符只能用于整形操作数,即char 、int 、long 、short类型。
^
异或运算符,为二元运算符,规则是对应位相同时为0,不同时为1,如下表:
^ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
~
取反运算符,为一元运算符,规则是将整数值取反,即将0变成1,1变成0,如下表:
~ | 0 | 1 |
---|---|---|
1 | 0 |
|
或运算符,为二元运算符,对应位只有同时为0时,才变成0,否则都为1,如下表:
| | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
&
与运算符, 二元运算符,只有当对应位同时为1时,才变为1,否则都为0,如下表:
& | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
上述代码中出现的^=
这个操作符号是巧用了异或运算符对number[0]和number[1]进行了替换,假设number[0]的值为12,二进制为0000 1100,number[1]值为10,二进制为0000 1010
number[0] ^= number[1] ==>
0000 1100 ^ 0000 1010 = 0000 0110
number[1] ^= number[0] ==>
0000 1010 ^ 0000 0110 = 0000 1100
number[0] ^= number[1] ==>
0000 0110 ^ 0000 1100 = 0000 1010