我有2个字符串,每个字符串包含25个字符。例如
X = "0000111111110111111111110"
Y = "0000011111000000000000000"
如果每个具有“ 1”字符串Y的位置在字符串X中也具有“ 1”,那么最有效的识别或为假的方法是什么?在此示例中,它应返回True,因为X中有1与Y中所有1的位置匹配。
我可以阅读每个角色的位置,并比较所有25个字符,但我希望某个聪明的人会知道更优雅的方式。
答案 0 :(得分:5)
更容易的方式是使用Convert.ToInt32()
将字符串解析为二进制文字并执行二进制AND
:
Public Function MatchAsBinary(ByVal x As String, ByVal y As String) As Boolean
Dim x_int = Convert.ToInt32(x, 2)
Dim y_int = Convert.ToInt32(y, 2)
Return (x_int And y_int) = y_int
End Function
更快(在发行版本中约为10次)的方式是直接比较字符:
Public Function MatchAsChars(ByVal x As String, ByVal y As String) As Boolean
For i As Integer = 0 To y.Length - 1
If y(i) = "1"c AndAlso x(i) = "0"c Then
Return False
End If
Next
Return True
End Function
答案 1 :(得分:1)
如果您将字符串视为二进制数字,则可以将其转换为数字,然后使用按位和运算符,如下所示:
SELECT
P.Name AS [Playlist Name]
,PT.TrackId AS [Track ID]
FROM PlaylistTrack AS [PT]
FULL JOIN Playlist AS [P]
ON PT.PlaylistId = P.PlaylistId
GROUP BY P.Name, PT.TrackId
HAVING COUNT(CONCAT(P.Name,PT.TrackId)) > 1
ORDER BY P.Name
,将输出Playlist Name Playlist ID Track ID
Audiobooks 6 NULL
Movies 7 NULL
Music 8 1
Music 8 2
Music 8 3
Music 8 4
,并为最多64个字符的字符串工作。
或者,在您的评论之后,您可以使用Module Module1
Sub Main()
Dim X = "0000111111110111111111110"
Dim Y = "0000011111000000000000000"
Dim Xb = Convert.ToInt64(X, 2)
Dim Yb = Convert.ToInt64(Y, 2)
Console.WriteLine((Xb And Yb) = Yb)
Console.ReadLine()
End Sub
End Module
,因为那样可以为数据提供足够的位。
答案 2 :(得分:1)
可以做类似的东西@JoshD上面所说的,但使用MAIL_DRIVER=sendmail
MAIL_HOST=sg2plcpnl0003.prod.sin2.secureserver.net
MAIL_PORT=465
MAIL_USERNAME=info@ezmoverandrental.com
MAIL_PASSWORD='eZia120$'
MAIL_ENCRYPTION=ssl
从二进制串到整数转换。
VERSION BUILD=10021450
URL GOTO=https://EXAMPLE.com
TAG POS=3 TYPE=A ATTR=TXT:Funny
TAG POS=1 TYPE=H3 ATTR=TXT:Funny<SP>Dogs<SP>Compilation
答案 3 :(得分:1)
这包括什么其他人已经表明加上用于一次每个比特一个测试。
Dim s As String = "0000011111000000000000000"
Dim X As String = "0000111111110111111111110"
Dim Y As String = "0000011111000000000000000"
Dim xi As Integer = Convert.ToInt32(X, 2)
Dim yi As Integer = Convert.ToInt32(Y, 2)
'check each bit
For i As Integer = 0 To 24
Dim msk As Integer = 1 << i
If (msk And xi) = msk AndAlso (msk And yi) = msk Then
Debug.WriteLine("Bit {0} on in both", i)
End If
Next
'all bits
Dim rslt As Integer = xi And yi
s = Convert.ToString(rslt, 2).PadLeft(25, "0"c)
答案 4 :(得分:-1)
Dim intY As Integer = CInt(Y)
Dim res As Boolean = (CInt(X) And intY) = intY
将它们转换为整数,按位获取与1匹配的所有实例,然后进行比较以查看Y是否被该比较更改了。如果比较保存的原始Y,其结果将是真。