首页 > 编程语言 >[算法]按位异或^的种种玩法

[算法]按位异或^的种种玩法

时间:2023-10-02 13:11:56浏览次数:30  
标签:nums int 玩法 ret 异或 按位 单身

本文使用C语言

什么是按位异或^

首先将不同数制的数写成二进制,例如9->0b1001.
然后最末位对齐,依次按位异或.
规则:0 ^ 0= 0 ; 1 ^ 1 = 0; 1 ^ 0 = 1
推论:任意整数x,都有0^x = x ; x ^ x = 0\


来看看应用

寻找一个单身狗数

[1,3,2,2,3]这样除了某一个数1,剩下的数字都是成对的,也就是说遍历一次数组,把所有的元素按位异或在一起,结果便是落单的那个1

//代码实现
int arr[] = {1,3,2,2,3};
int sz = sizeof(arr)/sizeof(arr[0]);//求数组大小
int ret  = 0;
for (int i =0;i<sz;i++)
{
    ret^=arr[i];
}

return ret; //此时ret即为落单的那个数

变形

消失的数

已知一个由0~n(缺失一个数)填充的数组,例[0,6,4,2,3,1],例中的数组少了一个5,而我们已知数组包含0~6中的5个数,就可以将数组元素与0~6按位异或到一起,将问题消失的数转化为问题寻找单身狗,消失的数变成剩下的那个单身狗

//代码实现
int missingNumber(int* nums, int numsSize)
{
    int ret = 0;
    for(int i = 0;i<numsSize;i++>)
    {
        ret^=nums[i];//历遍nums的所有元素
        ret^=i;//历遍0~numsSize-1
    }
    ret^=numsSize;//补上numsSize;
    return ret;
}

进阶

找到两个单身狗

数组再升级,单身狗变成了两个,导致不能粗暴地把所有元素按位异或来求出两个数,但我们仍可以将问题简化:能否将两个单身狗分到两个数组,使之转化为两个独立的求单个单身狗问题。于是难点来到了如何分组

方案之一便是运用按位异或右移运算符

因为两个不同的数,在二进制上作比较,就至少有一位是不同的,以那一位为01分成两组,便可将两个单身狗分开.而若要查找具体是哪一位,将列表中所有元素(就包括了两数)按位异或后再用右移运算符逐位检验是否为1,之后便可轻松分组,并直接按位异或得出结果

//代码实现
int* singleNumber(int* nums, int numsSize, int ret[2]){
    int ret1 = 0;
    int ret2 = 0;
    int n = 0;//用于记录"1"在哪一位
    int tmp = 0;
    for(int i =0;i<numsSize;i++)
    {
        tmp^=nums[i];
    }
    while((tmp>>n) !=1 )
    {
        n++;
    }
    for(int i = 0; i<nums;i++>)//再次历遍
    {
        if((nums[i]>>n ==1))//分组1
        {
            ret1^=nums[i];
        }
        else  //分组2
        {
            ret2^=nums[i];
        }
    }
    ret[0] = ret1;
    ret[1] = ret2;
    return ret;
}

思考:3个,4个....N个单身狗时呢?

标签:nums,int,玩法,ret,异或,按位,单身
From: https://www.cnblogs.com/SDF0521/p/17739861.html

相关文章

  • 深入理解按位操作符:位运算的魅力
    最近在审阅他人的代码时,我意外地发现了一个按位赋值操作符。由于之前的开发经验中从未接触过这种操作符,我决定进行了一番深入的资料研究。我发现,尽管它们可能不如一些更常见的操作符广泛使用,但在某些情况下,它们可以成为解决问题的强大工具。在本文中,我们将深入探讨按位操作符,详细了......
  • 国庆期间“头像+国旗”玩法是如何实现的?
    前言随着一年一度的国庆假期越来越近,身边的国庆氛围也越来越重,很多人也开始换上了渐变国旗头像,提前为祖国母亲庆生。那每年都很火的渐变国旗头像要如何制作呢?其实一点也不难!接下来就分享一种渐变国旗头像生成方法。制作原理上传原始微信或其他头像,将头像的Image对象用Graphics......
  • 解锁Mybatis-Plus条件构造器的全新玩法,Spring Boot开发再也不用愁!
    ......
  • Soul创新社交元宇宙玩法,满足Z世代年轻人的社交需求
    作为上线于2016年的新型社交平台,SoulApp以“不看颜值,看兴趣”吸引了大量年轻人在平台互动、交流,也沉淀了相应的用户画像、兴趣图谱、社交关系。在不断服务用户、为其提供更好的社交体验的过程中,Soul找到了能够更高效、优质的实现人与人、人与内容、人与技术连接的最佳路径,也......
  • 甘特图的这些新玩法,你都知道吗?
    摘要:本文由葡萄城技术团队于博客园发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言甘特图是项目管理、生产排程、节点管理中非常常见的一个功能。那么,有没有一种方法能够帮助将甘特图引入到系统中,让数据的进度、排程数据的......
  • 那些让我世界观崩塌的c/c++玩法
    if('\0'==0){printf("true");}else{printf("false");}----------------------------------------------inti=false; if('\0'||0||NULL||i){ printf("true&q......
  • 牛客周赛 Round 12 D 小美的区间异或和
    Link首先这个题目的限制卡的很死,最好是O(n)解决,其次当看到异或的时候,就可以考虑按照二进制位进行计算。对于这个题,我们定义\(dp_i\)表示以\(a_i\)为最右端的子区间的答案的和那么首先可以想到,贡献给这个答案的有两个部分,包括\(a_i\)的和不包括的,其中不包括\(a_i\)的部分的答案......
  • DAY005_异或运算
    运算规则二进制:相同为0相异为1十进制:相同为0任何数字和0异或都是它本身不利用额外变量交换两个数数组中一种数字出现了奇数次,其他数都出现了偶数次,怎么得到这个出现了奇数次的数将所有的数异或得到的结果就是这个期望的数字异或可以使用交换律,所有出现了偶数次的数字异......
  • Intel正式发布雷电5:120Gbps带宽、240W充电逆天!玩法远胜USB4 2.0
    Intel正式发布了全新一代的Thunderbolt5接口标准,也就是雷电5,无论传输速度还是连接能力,都实现了一次巨大的飞跃,更是展示了基于雷电5的新一代笔记本、扩展坞原型。这里,我们就看看雷电5到底带来了哪些变化,可以如何改变我们的工作、生活和娱乐方式,以及Intel在背后有怎样的思考,做出了......
  • 关于异或运算的一道题
      和白球的数量无关,  黑球偶数个时,概率0%。   黑球奇数个时,概率100%。  设白球是0,黑球是1    0 0 ——> 0          1 1——> 0   0 1 ——> 1        ......