String 如何找到长度不一定相等的字符串的汉明距离?
我有一个任务要求我找到两个长度不一定相等的用户输入字符串的汉明距离 因此,我做了以下算法:String 如何找到长度不一定相等的字符串的汉明距离?,string,assembly,dos,x86-16,hamming-distance,String,Assembly,Dos,X86 16,Hamming Distance,我有一个任务要求我找到两个长度不一定相等的用户输入字符串的汉明距离 因此,我做了以下算法: 读两个字符串 检查每个字符串的长度 比较字符串的长度 if(str1[digitNo] XOR str2[digitNo] == 1) inc al END IF 如果(str1较短) 将计数器设置为str1的长度 如果结束 如果(str1更长) 将计数器设置为str2的长度 如果结束 如果(str1==str2) 将计数器设置为str1的长度 如果结束 循环遍历字符串的每个数字 if(
if(str1[digitNo] XOR str2[digitNo] == 1)
inc al
END IF
将计数器设置为str1的长度
如果结束
将计数器设置为str2的长度
如果结束
将计数器设置为str1的长度
如果结束
if(str1[digitNo] XOR str2[digitNo] == 1)
inc al
END IF
if(str1[digitNo] XOR str2[digitNo] == 1)
inc al
END IF
但我被困在第三步,我似乎无法让它工作。有什么帮助吗
我试着用寄存器来保存值,但都不起作用,我还是没能让它起作用
; THIS IS THE CODE I GOT
.model small
.data
str1 db 255
db ?
db 255 dup(?)
msg1 db 13,10,"Enter first string:$"
str2 db 255
db ?
db 255 dup(?)
msg2 db 13,10,"Enter second string:$"
one db "1"
count db ?
.code
.startup
mov ax,@data
mov ds,ax
; printing first message
mov ah, 9
mov dx, offset msg1
int 21h
; reading first string
mov ah, 10
mov dx, offset str1
int 21h
; printing second message
mov ah, 9
mov dx, offset msg2
int 21h
; reading second string
mov ah, 10
mov dx, offset str2
int 21h
; setting the values of the registers to zero
mov si, 0
mov di, 0
mov cx, 0
mov bx, 0
; checking the length of the first string
mov bl, str1+1
add bl, 30h
mov ah, 02h
mov dl, bl
int 21h
; checking the length of the second string
mov bl, str2+1
add bl, 30h
mov ah, 02h
mov dh, bl
int 21h
; comparing the length of the strings
cmp dl,dh
je equal
jg str1Greater
jl str1NotGreater
; if the strings are equal we jump here
equal:
mov cl, dl
call theLoop
; if the first string is greater than the second, we jump here and set counter of str1
str1Greater:
; if the second string is greater than the first, we jump here and set counter to length of str2
Str1NotGreater:
; this is the loop that finds and prints the hamming distance
;we find it by looping over the strings and taking the xor for each 2, then incrementing counter of ones for each xor == 1
theLoop:
end
因此,在我提供的代码中,它应该打印每个字符串的长度(它打印相邻的长度),但它似乎总是打印第一个字符串的长度,两次。用来存储第一个字符串长度的寄存器是dl,用来存储第二个字符串长度的寄存器是dh,如果我把它改回dl,它会打印出正确的长度,但我想比较一下长度,如果我两次都保存在dl中,我想是不可能的
但它似乎总是打印第一个字符串的长度,两次
当使用DOS函数02h输出字符时,您无法选择使用哪个寄存器来提供字符总是DL
因为在打印两个长度后,您仍然希望使用这些长度,所以最好不要首先破坏它们。将第一个长度放入BL
,将第二个长度放入BH
。为了输出,您将这些文件依次复制到DL
,在那里您可以转换为字符。这当然只能用于最多9个字符的字符串
附加说明
- 长度是无符号的数字。使用上面的和下面的无符号条件
- 谈论长和短对字符串更有意义
- 如果仅仅是代码中的一个错误就可以完成任务,那么不要使用3次跳转
- 循环中的代码可能会使用
作为计数器。别忘了归零CX
。如果允许使用超过原始8086的指令,可以像上面那样使用2条指令,也可以使用CH
movzx-cx,BL
字符串输入函数应该返回字符串的某个位置的长度;保存它。我不知道你为什么要在你调用的代码中用
ah=02h
再次调用DOS系统,检查第一个字符串的长度。哦,那是单个字符的调试打印吗?(如果大于9,可以在ASCII表中查找)。这不是我所说的“检查”。我想你的意思是用strlen或其他方法来查找以0结尾的字符串的结尾。无论如何,你只需要设置count=min(len1,len2)。最简单的方法是reg=len1
,然后在reg=len2
上进行cmp/jcc。您不必关心它们是否相等。此外,如果输入字符串由任意ASCII字符组成,您可能希望循环异或结果的位,即“总体计数”。它可能不完全是1
。e、 或256字节的查找表。或者一个黑客。感谢您的回复,只是为了进一步澄清,这是一个汇编8086代码。这是我在大学里正在学习的一门课程,它是语言的入门,我们不允许使用字符串函数,因为它们不在教学大纲中。此外,我们被要求在两个字符串之间进行最少数量的替换,因此,如果一个字符串比另一个字符串长,我们只需要循环到较短字符串的末尾,因此,我们确实需要关心它们是否相等。是的,我理解,当我说strlen
时,我指的是在0
字节处停止的循环,不是对标准库的函数调用。当你说替换时,改变1位算作1,还是替换整个字节算作1,不管字符有多不同?如果是后者,那么您应该检查str1[digitNo]!=str2[digitNo]
,而不是它们的按位异或==1(这是毫无意义的,除非您的字母表仅为ASCII0和1
)或ASCII码之间的整数汉明权重。请注意,a!=b
相当于一个异或b!=0
根据评论,OP显然需要按位汉明距离。他们的XOR==1将字符串视为位字符串,而不是字节字符串。因此,您需要对不匹配字节的异或进行popcount。此外,您还重复了OP的错误,即通过单独检查equal来实现过度复杂化。如果它们相等,您可以选择任意一个长度,而不需要单独识别该条件。您只需要len=(len1