LINUX.ORG.RU

y = x ^ (x >> 1);
y = y ^ (y >> 2);
y = y ^ (y >> 4);

А для x86 есть специальные флаг и команда перехода - jp.

anonymous
()
Ответ на: комментарий от anonymous

Хрена себе ! Я бы так написал:

bool odd (unsigned char byte)
{
int count = 0;
while (byte)
{
count+= byte & 1;
byte = byte >> 1;
}
return count & 1;
}

Твой вариант конечно красивей и но гораздо менее понятней :)
count занулять имеет смысл

linuxsoft
()
Ответ на: комментарий от linuxsoft

А у меня быстрее будет работать.
Согласен, что надо занулять count и писать unsigned.
Но каждый -1 будет "убивать" единицу, где бы она ни стояла, в то время, как у тебя она убьется тогда, когда доедет до первой позиции. В итоге - если, например, имеется единица в старшем разряде, то у тебя она посчитается только на восьмом цикле, а у меня - сразу.

anonymous
()
Ответ на: комментарий от anonymous

> а зачем там занулять если там и так ноль будет

автоматическая POD переменная разве инициализируется?

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Да мой косяк. Локальная переменная не инициализируется.Только глобальные.

anonymous
()
Ответ на: комментарий от linuxsoft

  А я, а я... :) а я бы вот как:

int odd(unsigned char byte)
{
        int count=byte;
        while(byte)
                count ^= byte >>= 1;
        return count & 1;
}

  Одно обидно: по скорости все 3 варианта абсолютно одинаково работают :)
  Оптимизация, однако... Или моё неумение тесты проводить корректно :)
  Хотя первый, конечно, самый изъ..нутый.

Teak ★★★★★
()
Ответ на: комментарий от Teak

> Хотя первый, конечно, самый изъ..нутый.

Самый?

int odd(unsigned char byte)
{
    int parity = 0x6996;
    return 
        ((parity >> (byte & 0x0f)) ^
         (parity >> (byte >> 4))) &
        0x01;
}

vnp
()

слушай первого анонимоса, еще как вариант:

y = x ^ (x >> 1); y = (y ^ (y >> 2)) & 0x11; y = y % 15;

y будет 1 для нечетного

lg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.