Мне нужно написать выражение одного байтового веса Хэмминга только по бинарным операциям (&, ^, >>); без какой-либо петли, просто формулы.Вес Хэмминга написан только в бинарных операциях?
Я знаю, что существует множество алгоритмов, которые позволяют вычислять вес Хэмминга, но все они используют арифметические операции или цикл.
Если мы возьмем алгоритм из http://en.wikipedia.org/wiki/Hamming_weight, то первую сумму D = B + C можно записать в виде D = B^C^(B & C < < 1), но две следующие суммы являются более сложными.
Есть ли у кого-нибудь подсказка?
ОБНОВЛЕНИЕ: Благодарим вас за помощь. На самом деле, мне нужно было что-то вроде следующего:
int popcount_1(unsigned char in){
unsigned char m1 = 0x55;
unsigned char m2 = 0x33;
unsigned char m4 = 0x0f;
unsigned char B,C = 0;
unsigned char x = in;
x = (x & (x << 1) & (m1 << 1)) | (m1 & (x^(x >> 1)));
B = x & m2;
C = (x >> 2) & m2;
x = B^C^((B & C) << 1);
B = (x & m4)^((x >> 4) & m4);
C = (x & ((x >> 4) & m4)) << 1;
x = B^C^((B & C) << 1);
return x;
}
Этот код приведет Хэмминга вес переменной в. Он не содержит никаких инструкций +, - или сравнения, и он может работать на 8-битных микроконтроллерах. Тем не менее, требуется больше операций, чем большинство других решений. Теперь я пытаюсь его упростить.
UPDATE2: Еще одно решение, основанное на 64-битных регистров, предложен @Evgeny Клюева
Это домашнее задание? – Poindexter
Nop, это не так. Я делаю это, чтобы получить аналитическое выражение для оптимизации поиска ключевых слов в анализе дифференциального анализа мощности на основе веса/расстояния Хэмминга. На самом деле, я почти нашел это выражение, поэтому скоро опубликую его. – Roman
Я не уверен, что я понимаю, если это просто для оптимизации, ни одно из этих двух ограничений не должно существовать, и вам понадобится «любой способ - самый быстрый» (который сильно зависит от платформы) – harold