Может кто-нибудь объяснить это сравнение SSE BigNum?
Если вы посмотрите на этот ответ, автору удается создать компактный алгоритм сравнения для 2 целых двоичных знаков, хранящихся в двух регистрах SSE. Я не слишком хорошо слежу за ним:)
Что я сделал до сих пор:
если l = a < b = {a[i] < b[i] ? ~0 : 0}
и
e = a == b = {a[i] == b[i] ? ~0 : 0}
то a < b == l[3] v e[3]l[2] v e[3]e[2]l[1] v e[3]e[2]e[1]l[0]
Но это не похоже на то, что делает автор. Что мне не хватает? Что нужно для сравнения больше?
Ответы
Ответ 1
Я упустил из виду, чем ответ не был общим, но ограничен 64-битными бинумами, состоящими из 32-битных элементов. Если у вас есть 2 64-битных вектора a = {a0, a1}
, b = {b0, b1}
, то программа вычисляет:
a < b = ((a1 < b1) | (a0 < b0)) & ~(a1 > b1)
В моем вопросе я стремился к произвольно длинным BigNums, реализованным с регистрами SSE/AVX.