前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >与异或操作相关的简单算法题

与异或操作相关的简单算法题

作者头像
用户5513909
发布2023-04-25 11:30:36
1820
发布2023-04-25 11:30:36
举报

异或运算的性质

1、0 ^ N == N, N ^ N==0 2、异或运算满足交换律和结合律

题目1:如何不使用额外变量交换两个数
代码语言:javascript
复制
int a  == 甲; int b = 乙;
a = a ^ b;
b = a ^ b;
a = a ^ b;

把上面代码分为三个步骤 第一步: a = a ^ b; 此步骤过后 a = 甲 ^乙;b = 乙; 第二步: b = a ^ b; 此步骤过后 a = a ^ b = 甲 ^ 乙;b = a ^ b = 甲 ^ 乙 ^ 乙 = 甲; 第三步: a = a ^ b; 此步骤过后b = 甲; a = a ^ b = 甲 ^ 乙 ^ 甲 = 乙; 完成交换 注意:两个交换的数不能指向相同内存!!!

题目2:一个数组中有一种数出现了奇数次, 其他数都出现了偶数次,怎么找到并打印这种数

方法:遍历数组所有元素,一直异或。因为两个相同的数异或为0,所以异或到最后的数就是出现奇数次的数。

代码语言:javascript
复制
public static void printOddNumber1(int[] arr) {
	int eor = 0;
	for (int i = 0; i < arr.length; i++){
		eor = eor ^ arr[i];
	}
	System.out.println(eor)
}
题目3:怎么把一个int整型数,二进制位最右侧的1提取出来

例如:输入1001……01000 输出0000……01000 方法:加入输入的为N,这输出为 N & (~N + 1) 步骤: 输入:1001……01000 取反:0110……10111 再加一:0110……11000 相与:0000……01000

题目4:一个数组中有两种数出现了奇数次, 其他数都出现了偶数次,怎么找到并打印这两种数

思路: 1、按照题目2的方法,全部的数一起异或,得到eor = a ^ b 2、按照题目3的方法,提取eor最右边1(其实任意一个一都行,因为值为1的地方表示两个数在该位不同),根据这个位是否为1,将数组分为A、B两部分。 3、对A部分的数进行一起进行异或运算,得到数1,将数1与eor异或得到数2

代码语言:javascript
复制
public static void printOddNumber(int [] arr) {
	int eor = 0;
	for (int i = 0; i < arr.length; i++) {
		eor = eor ^ arr[i];
	}
	int rightOne = eor & (~eor + 1);
	int numA = 0;
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] & eor == 0) {
			numA = numA ^ arr[i];
		}
	}
	numB = eor ^ numA;
}
题目5:获得一个数二进制位,为1的个数
代码语言:javascript
复制
public static int bitCount(int N) {
	int count = 0;
	while (N != 0){
		int rightOne = N & ((~N) + 1);
		count++;
		N = N ^ rightOne;
	}
	return count;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异或运算的性质
    • 题目1:如何不使用额外变量交换两个数
      • 题目2:一个数组中有一种数出现了奇数次, 其他数都出现了偶数次,怎么找到并打印这种数
        • 题目3:怎么把一个int整型数,二进制位最右侧的1提取出来
          • 题目4:一个数组中有两种数出现了奇数次, 其他数都出现了偶数次,怎么找到并打印这两种数
            • 题目5:获得一个数二进制位,为1的个数
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档