Вопрос с битового сайта

Вот код:

unsigned int v;  // word value to compute the parity of
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
v &= 0xf;
return (0x6996 >> v) & 1;

Он вычисляет четность данного слова, v. Что означает 0x6996?

Число 0x6996 в двоичном формате равно 110100110010110.


person dato datuashvili    schedule 08.07.2010    source источник
comment
какой у Вас вопрос? как работает этот код? или как рассчитать-то? вы задаете вопросы снова и снова в одной и той же непонятной манере, пожалуйста, постарайтесь быть конкретными   -  person Andrey    schedule 08.07.2010
comment
@Andrey: На этот раз он четко спрашивает, что означает значение 0x6996 в этом коде. ИМО, это достаточно конкретный вопрос.   -  person sharptooth    schedule 08.07.2010


Ответы (2)


Алгоритм сжимает 32-битное целое число в 4-битное значение той же четности с помощью последовательных побитовых операций ИЛИ, а затем выполняет И с 0xf, так что в младших 4-битах остаются только положительные биты. Другими словами, после строки 5 v будет целым числом от 0 до 15 включительно.

Затем он сдвигает это магическое число (0x6996) вправо на это значение 0-16 и возвращает только младший значащий бит (& 1).

Это означает, что если в позиции v бита 0x6996 есть 1, то вычисленный бит четности равен 1, в противном случае он равен 0 - например, если в строке 5 v вычисляется как 2, то возвращается `, если это было 3, то 0 быть возвращены.

person Mark Pim    schedule 08.07.2010

Первые четыре строки преобразуют v в 4-битное число (от 0 до 15) с той же четностью, что и исходное. 16-битное число 0x6996 содержит четность всех чисел от 0 до 15, и сдвиг вправо используется для выбора правильного бита. Это похоже на использование таблицы поиска:

//This array contains the parity of the numbers 0 to 15
char parities[16] = {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};
return parities[v];

Обратите внимание, что элементы массива совпадают с битами 0x6996. Использование (0x6996 >> v) & 1 дает тот же результат, но не требует доступа к памяти.

person interjay    schedule 08.07.2010