C语言——————按位异或的妙用

本文介绍了一个问题,如何在一个数组中,所有数字除了一个出现一次外,其余都出现两次。通过按位异或操作,找出这个独一无二的数字。同时,文章展示了如何利用按位与和右移操作找到两个单身狗,以及如何在不创建新变量的情况下进行数值交换。
摘要由CSDN通过智能技术生成

题目:

      一个数组中只有一个数字是出现一次,其他所有数字都出现了两次。

     编写一个函数找出这个只出现一次的数字。

例如:

  有数组元素是:1,2,3,4,5,1,2,3,4

            输入:5

代码实现:

bf4d9b978c534371b68d9d799987a54c.png

 

解析:

1.首先,需要理解什么是按位取反(^)。

1.1在计算机里,数据都是通过二进制的形式进行储存(0或1)

1.2按位取反(^)。

两数按位取反,相同为0,不同为1。

7ff66275735c44cabe33c73ac65f9980.png

核心注意:         

d634c52bf9194307b9572005fb55687c.png

           a^a=0

           a^0=a

cd2e206b4c3a42fc99d5a46a2575c824.png 2f339898a5014b0baec7adaf63470fd9.png

       所有数组元素进行按位异或,成对变0,最后只剩下未成对的单身狗

扩展:假如有两个单身狗呢?

      例如:数组arr[10]={1,2,3,4,5,1,2,3,4,5,6}

    试用代码寻找出其中的两只单身狗。

代码实现: bf3dfa88c0f0451ebcdbf4e976047709.png  思路:

     如果存在两个单身狗,那我们就试着将它们分开来寻找,也就是分为两组。

那要怎么样才能将这两只单身狗分别分为两组呢?

704c03c9766e4c7899741f6f19b4b7ad.png

 在这里我们将所有的元素进行按位异或,也就等于两只单身狗进行按位异或(其他的都成对为0走了)。

接下来,我们要找出这两只单身狗的不同来进行分组。我们回忆起按位异或(^)的功能:二进制按位排列后,相同为0,不同为1。

6e0da3be23d54ceeb4e44b91b9b668bf.png

依靠这一点,我们就只需要在ber(所有元素按位异或的结果)里找出一个1的排列位置就能找到这两只单身狗的“不同点”(在那个位置上两只单身狗分别为0或1),然后进行分组寻找。

我们将运用按位与(&)和右移操作符(>>)的功能:

d2abc6e1198e488ab08b7a5ce93698cc.png

--------------------------------------------80dc3cef2c104f94bf8fe1058ad45d0d.png

 实现:

3202599de13048ae9277a1396cca3e9d.png

 通过右移操作符(>>)实现移位寻找“不同点”

如何通过和1进行按位与(&)是否为1,找出“不同点”。

681ac558285847f19c1bae6ea9ab1a9f.png

 

最后,通过ber^dog1得出另一个dog(ber^dog1=dog2^dog2^dog1=dog1)

 实现:

1af3e40bd38e445f89c5ea4df306c6f8.png

 完成。

趣味提升:

问:在不创建第三个变量的前提下,用代码实现两数交换。

       例如:a=2, b=3。

      输出: a=3, b=2

实现:

 e510b1ed8e284538b91819434e9a68fa.png

 核心:a^a=0

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值