Совпадение частей строки - PullRequest
       0

Совпадение частей строки

0 голосов
/ 01 февраля 2019

У меня есть 2 строки, каждая из которых содержит 25 символов.Например,

   X = "0000111111110111111111110"
   Y = "0000011111000000000000000"

Какой самый эффективный метод для идентификации, истина или ложь, если каждая позиция со строкой "1" Y также имеет "1" в строке X?В этом примере он должен вернуть True, поскольку в X есть 1, которые соответствуют позициям всех 1 в Y.

Я мог бы прочитать позицию каждого символа и сделать сравнение для всех 25, но надеялся, что какой-нибудь умный человек узнаетболее элегантным способом.

Ответы [ 5 ]

0 голосов
/ 01 февраля 2019

Это включает в себя то, что показали другие, плюс тест для каждого бита по одному за раз.

    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)
0 голосов
/ 01 февраля 2019

Более простой способ заключается в использовании 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

The быстрее (~ 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
0 голосов
/ 01 февраля 2019

Если вы рассматриваете строки как двоичные числа, вы можете преобразовать их в числа, а затем использовать побитовый оператор и оператор, например:

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

, который выдаст True и будет работать со строками додо 64 символов.

Или, следуя вашему комментарию, вы можете использовать Convert.ToInt32, поскольку это даст достаточно битов для ваших данных.

0 голосов
/ 01 февраля 2019

Может сделать нечто подобное @JoshD, как сказано выше, но используйте Convert.ToInt32(Y, 2) для преобразования двоичной строки в целое число.

Xint = Convert.ToInt32(X, 2)
Yint = Convert.ToInt32(Y, 2)

return ((Xint And Yint) = Yint)
0 голосов
/ 01 февраля 2019
Dim intY As Integer = CInt(Y)    
Dim res As Boolean = (CInt(X) And intY) = intY

Преобразуйте их в целые числа, получите все экземпляры совпадения 1 с побитовым И, затем сравните, чтобы увидеть, изменилось ли Y в результате этого сравнения.Если сравнение сохранило исходный Y, результатом будет True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...