前提条件–找到在数组中一次出现的元素,其中每个其他元素出现两次
问题–给定11个数字,编写汇编语言程序以查找一次出现的元素,其中5个数字出现两次,而一个元素出现一次。
例子:
Input : [01H, 02H, 09H, 01H, 01H, 02H, 0AH, 01H, 09H, 03H, 03H]
Output : 0AH
Every number appears even number of times, except 0AH which appears only once.
算法:
使用XOR。
所有元素的XOR将给出一次出现的数字。这是因为数字与自身的XOR为0,数字与0的XOR为数字本身。
^ => XOR
res = 01H ^ 02H ^ 09H ^ 01H ^ 01H ^ 02H ^ 0AH ^ 01H ^ 09H ^ 03H ^ 03H
Since XOR is associative and commutative :
res = 0AH ^ (01H ^ 01H) ^ (01H ^ 01H) ^ (02H ^ 02H) ^ (03H ^ 03H) ^ (09H ^ 09H)
= 0AH ^ 0 ^ 0 ^ 0 ^ 0 ^ 0
= 0AH ^ 0
= 0AH
脚步:
- 将第一个数字的地址加载到HL寄存器对中
- 用0BH初始化寄存器C,因为我们必须遍历11个元素。它充当柜台
- 用0初始化累加器
- 用累加器对HL寄存器中存储的地址上存在的值进行XOR,然后递增HL寄存器中的地址
- 对其余10个元素重复步骤4
- 将累加器的值存储在201DH中(任意)
201DH包含答案。
ADDRESS | LABEL | MNEMONIC |
---|---|---|
2000H | LXI H, 2012H | |
2001H | ||
2002H | ||
2003H | MVI A, 00H | |
2004H | ||
2005H | MVI C, 0BH | |
2006H | ||
2007H | LOOP | MOV B, M |
2008H | XRA B | |
2009H | INX H | |
200AH | DCR C | |
200BH | JNZ LOOP | |
200CH | ||
200DH | ||
200EH | STA 201DH | |
200FH | ||
2010H | ||
2011H | HLT |