Найдите шаблон двоичных чисел, используя сдвиг вправо и побитовый - И?
-
03-07-2019 - |
Вопрос
Я пытаюсь написать функцию на ассемблере, которая определит, содержит ли более длинное двоичное число меньший двоичный шаблон.
Пример:
Делает 100111 содержать 1001?
Когда я прочитал эту задачу, я решил, что буду выполнять побитовое вычисление - И с большим числом, и с его меньшим шаблоном, сдвигая вправо (логически) каждый раз в цикле.
Итак, в моей голове я подумал, что это подойдет:
100111 AND 1001 = 0
Shift-right 1
010011 AND 1001 = 0
Shift-right 1
001001 AND 1001 = 1 // Pattern FOUND!
и повторяйте это до тех пор, пока либо число не будет сдвинуто до тех пор, пока оно не станет равным нулю, либо И не вернет 1.
Тем не менее, я думаю, что, должно быть, я что-то перепутал, потому что это возвращает 1 для большинства вещей, которые я ввел, при первом запуске цикла.Я запутался в своем использовании И?
Решение
Проблема в том, что "частичные совпадения" также возвращают ненулевое значение для вашего И проверяют:
100111 AND 001001 = 000001
Итак, это проверяет, если Любой из битов совпадают, но вы хотите убедиться, ВСЕ биты те же самые.Результат И должен быть равен шаблону, который вы ищете:
x = 100111
if (x AND 1001 == 1001)
print "found"
Другие советы
Вы должны И и затем протестировать шаблон поиска:
if ((TestPattern & SearchPattern) == SearchPattern)
{
// then match
}
(где &
представляет побитовое AND
)
Побитовый И работает не так, как вы ожидаете (судя по примерам и игнорируя обозначения, которые, по-видимому, предполагают, что вы используете побитовый И в качестве логического И битов).И "принимает во внимание" только те биты, которые установлены равными 1.Например, 1111 И 1001 == 1001.
Вам нужно использовать XOR и сравнить с 0 для совпадения (помните, что маскируйте биты, которые вы не сравниваете, из результата).В вашем примере совпадение найдено, когда (N ^ 1001) & 1111 == 0000
Чтобы убедиться, что оба бита 0 и 1 соответствуют вашему шаблону поиска, вам нужно сделать что-то вроде этого:
if ((InputPattern AND SearchMask) == SearchPattern)
{
// then match
}
В SearchMask
должно быть всего 1 бит, длина которого равна вашему searchPattern.Например, вы могли бы иметь SearchMask == 1111, SearchPattern == 1001
.