Я пытаюсь вычислить бит бит четности большого количества uint64. По битовой четности я имею в виду функцию, которая принимает uint64 и выдает 0, если число установленных бит равно, и 1 в противном случае.
В настоящее время я использую следующую функцию (by @Troyseph, найденный здесь):
uint parity64(uint64 n){
n ^= n >> 1;
n ^= n >> 2;
n = (n & 0x1111111111111111) * 0x1111111111111111;
return (n >> 60) & 1;
}
На той же странице SO есть следующая процедура сборки (by @papadp):
.code
; bool CheckParity(size_t Result)
CheckParity PROC
mov rax, 0
add rcx, 0
jnp jmp_over
mov rax, 1
jmp_over:
ret
CheckParity ENDP
END
который использует механизм флаг четности. Но я не могу заставить его работать с моей программой на C (я знаю, что нет сборки).
Вопрос. Как включить указанный выше (или похожий) код в виде встроенной сборки в исходный файл C, чтобы вместо этого выполнялась функция parity64()
?
(Я использую GCC с 64-битным Ubuntu 14 на Intel Xeon Haswell)
В случае какой-либо помощи функция parity64()
вызывается внутри следующей процедуры:
uint bindot(uint64* a, uint64* b, uint64 entries){
uint parity = 0;
for(uint i=0; i<entries; ++i)
parity ^= parity64(a[i] & b[i]); // Running sum!
return parity;
}
(Предполагается, что это "точечный продукт" двух векторов над полем Z/2Z, aka. GF (2).)