《C语言入门100例》第三例 数值交换

《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,如下表:

^01
001
110

~取反运算符,为一元运算符,规则是将整数值取反,即将0变成1,1变成0,如下表:

~01
10

|或运算符,为二元运算符,对应位只有同时为0时,才变成0,否则都为1,如下表:

|01
001
111

&与运算符, 二元运算符,只有当对应位同时为1时,才变为1,否则都为0,如下表:

&01
001
110

上述代码中出现的^=这个操作符号是巧用了异或运算符对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值