数据结构基础之《(4)—异或运算》

一、认识异或运算

1、异或运算
相同为0,不同为1
2、同或运算
相同为1,不同为0
3、异或记成无进位相加!

二、例子

1、6 ^ 7 = ?
解答:110 ^ 111 = 001

三、异或运算的性质

1、0 ^ N == N

2、N ^ N == 0

3、异或运算满足交换律和结合律
上面两个性质用无进位相加来理解就非常的容易

4、有abcde
不用管abcde是什么顺序,只要同一批数,异或的结果是一样的
异或运算和异或的顺序无关

四、测试题

1、题目一:如何不用额外变量交换两个数
int a = 甲
int b = 乙
a = a ^ b
b = a ^ b
a = a ^ b

分析:
第一步运算后,a = 甲 ^ 乙,b = 乙
第二步运算后,a = 甲 ^ 乙,b = 甲
第三步运算后,a = 甲 ^ 乙 ^ 甲,b = 甲
所以,a = 乙,b = 甲

但是字符串是不能用异或操作的,所以只能用于数值型数据进行交换

2、题目二:一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
将所有数异或到一起,留下的数就是奇数次的数

	// arr中,只有一种数,出现奇数次
	public static void printOddTimesNum1(int[] arr) {
		int eor = 0;
		for (int i=0; i<arr.length; i++) {
			eor ^= arr[i];
		}
		System.out.println(eor);
	}

3、题目三:怎么把一个int类型的数,提取出最右侧的1
比如:
int i = N
二进制形式:001101010000
我想得到一个结果:除了最右侧1有值外,剩下的位都变成0,就是000000010000

方法:
N & (~N + 1),N与上N取反加1
(1)第一步
~N = 110010101111
(2)第二步
~N+1 = 110010110000
(3)第三步
N & (~N+1) = 000000010000

4、题目四:一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
(1)第一步
假设数组中,a、b出现了奇数次,其他数都出现了偶数次
所有数异或起来的结果eor = a ^ b

但是怎么分开a和b呢?
eor不等于0
eor一定有一位是1
假设第8位是1,说明a的第8位和b的第8位不同
整个数组可以分为两大类:第一类是第8位是1的数,第二类是第8位是0的数
第8位上是1的数可能存在出现了偶数次的数
第8位上是0的数也可能存在出现了偶数次的数
但是a和b一定是分开的
最后把两个组分组异或!!!

	// arr中,有两种数,出现奇数次
	public static void printOddTimesNum2(int[] arr) {
		int eor = 0;
		for (int i=0; i<arr.length; i++) {
			eor ^= arr[i];
		}
		// eor = a ^ b
		// eor != 0
		// eor必然有一个位置上是1
		int rightOne = eor & (~eor + 1); //获取最右侧的1
		int onlyOne = 0; //eor'
		for (int i=0; i<arr.length; i++) {
			if ((arr[i] & rightOne) != 0) { //分组异或所有这一位是1的数
				onlyOne ^= arr[i];
			}
		}
		System.out.println(onlyOne + " " + (eor ^ onlyOne)); //onlyOne是其中一个数,eor是两个数异或结果
	}

5、题目五:获取一个数二进制1的个数
先拿原数求出第一个最右边为1的数,拿这个数和原数异或消掉。重复上述操作,每求出一个最右侧为1的数计数一次

	//获取一个数二进制1的个数
	public static int bit1counts(int n) {
		int count = 0;
		
		while(n !=0) {
			int rightOne = n & ((~n) + 1);
			count++;
			n = n ^ rightOne;
		}
		
		return count;
	}

### 回答1: 异或运算(XOR)是一种逻辑运算,当两个操作数相同时返回0,当两个操作数不同时返回1。BP算法(反向传播算法)是一种常用的训练神经网络的方法,通过反向传播误差来更新网络的权重和偏置。 要用BP算法解决Matlab中的异或运算问题,首先需要构建一个能够解决异或运算的神经网络模型。对于异或运算而言,我们可以使用一个具有两个输入、一个隐藏层和一个输出层的多层感知器(MLP)神经网络来解决此问题。 输入层有两个神经元,分别表示输入的两个操作数。隐藏层可以根据实际需要选择神经元数量,这里可以选择一个神经元。输出层有一个神经元,用于表示异或运算的结果。 接下来,我们需要确定神经网络的权重和偏置的初始值。可以随机给定一个初始值。 然后,我们可以使用BP算法进行训练。训练的过程中,我们将输入两个操作数与对应的异或运算结果一起作为输入-输出对来训练网络。通过前向传播计算得到输出值,然后通过比较输出值和实际值得到误差。 接下来,我们使用反向传播算法来调整网络的权重和偏置,使得误差逐步减小。通过反复迭代训练,最终达到模型收敛的目的。 训练完成后,我们就可以使用训练好的神经网络来进行异或运算了。将任意输入值作为操作数输入到神经网络中,即可得到相应的异或运算结果。 综上所述,通过使用BP算法训练一个具有一个隐藏层的神经网络,我们可以解决Matlab中的异或运算问题。使用这个训练好的模型,我们可以根据输入的操作数进行异或运算并得到结果。 ### 回答2: 异或运算是一种逻辑运算,也可以用于神经网络中的反向传播(Backpropagation,简称bp)算法。在MATLAB中,我们可以使用异或运算来实现bp算法,以解决分类或回归问题。 首先,我们需要准备训练数据集。对于异或运算而言,训练数据集包括输入数据和对应的输出标签。比如说,输入数据集可以是2维的,其中每个样本的特征向量由2个元素组成;而输出标签对应着每个样本的分类结果(0或1)。 接下来,我们可以使用MATLAB中的神经网络工具箱来构建一个包含隐层的人工神经网络。隐层可以增加网络的学习能力,提高分类或回归的准确性。在网络建立完成后,我们需要为网络设置训练参数,如学习率、迭代次数等。 然后,我们可以使用bp算法来训练神经网络。训练过程可以通过反向传播误差来更新网络的权重和偏置,以最小化网络的输出与真实标签之间的差异。最常用的优化算法是梯度下降法,其中梯度代表了误差对于网络权重的变化率。 在训练过程中,我们可以将训练数据集输入到网络中,并通过前向传播来计算网络的输出。之后,我们可以将网络的输出与真实标签进行比较,计算误差,并通过反向传播来调整网络的权重和偏置。这个过程将会循环多次,直到网络收敛或达到预定的迭代次数。 最后,我们可以使用训练好的网络来对新的数据进行分类或回归预测。通过将新的数据输入到网络中,并通过前向传播来计算网络的输出,我们可以得到预测结果。 通过以上步骤,我们可以使用异或运算的bp算法来解决MATLAB中的分类或回归问题。这个方法将会帮助我们构建和训练神经网络,从而得到准确的预测结果。 ### 回答3: 异或运算(XOR)是一种逻辑运算符,它返回两个操作数中仅有一个为真的结果。在神经网络中,异或运算是一种非线性运算,常用于分类问题的解决。BP算法(反向传播算法)是一种用于训练人工神经网络的常用方法。现在我们来讨论如何用BP算法解决Matlab中的异或运算。 在Matlab中,我们可以使用神经网络工具箱(Neural Network Toolbox)来实现BP算法解决异或运算。首先,我们需要创建一个人工神经网络对象,并设置网络的结构和参数。例如,我们可以使用feedforwardnet函数来创建一个前馈神经网络,该网络包含一个隐藏层和一个输出层。 接下来,我们需要准备训练数据和目标数据。对于异或运算,我们可以创建一个2×2的矩阵,其中每一行表示输入数据,每一列表示目标数据。矩阵的第一行可以表示0和0的输入,目标数据为0;矩阵的第二行可以表示0和1的输入,目标数据为1。 然后,我们可以使用train函数对神经网络进行训练。该函数会根据给定的训练数据和目标数据,通过BP算法来更新网络的权重和偏置。训练的目标是使神经网络能够正确地预测异或运算的结果。 训练完成后,我们可以使用sim函数来测试神经网络的性能。sim函数接受一个输入数据矩阵,并返回网络对应的输出矩阵。通过比较输出矩阵和目标数据矩阵,我们可以评估网络的准确性。 最后,我们可以使用神经网络进行预测。通过输入一个新的数据,神经网络可以根据已经学习到的权重和偏置来计算输出结果。 综上所述,我们可以通过使用BP算法和Matlab中的神经网络工具箱来解决异或运算问题。这个过程包括创建神经网络对象、准备数据、训练网络、测试性能和进行预测等步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值