Первое значение:
У меня есть двоичное значение, которое на самом деле представляет собой компактную серию 2-битных значений. (То есть каждые 2 бита в двоичном значении представляют 0, 1, 2 или 3.) Таким образом, например, 0, 3, 1, 2 становится 00110110. В этой двоичной строке меня интересуют только 3 ( или, наоборот, я мог бы перевернуть биты и заботиться только о 0, если это облегчит ваш ответ). Все остальные числа не имеют значения (по причинам, которые мы рассмотрим чуть позже).
Второе значение:
У меня есть второе двоичное значение, которое также представляет собой сжатую серию 2-битных значений, представленных таким же образом. Он имеет ту же длину, что и первое значение.
Математика:
Мне нужна сумма 2-битных чисел во втором значении, которые имеют ту же позицию, что и 3 из первого значения. Другими словами, если у меня есть:
First: 11000011
Second: 01111101
Тогда мой ответ будет «2» (я добавил первое и последнее число из «Второго» вместе, потому что это были единственные, у которых было «11» в первом значении, которое им соответствовало.)
Я хочу сделать это за как можно меньшее количество тактов (либо на графическом процессоре, либо на архитектуре x86). Однако я обычно ищу алгоритм, а не решение на ассемблере. Есть ли способ быстрее, чем маскировать два бита за раз от каждого числа и запускать несколько циклов?