psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2007-03-06 03:50 pm

C - прикол

Как быстро проверить, является ли число степенью двойки?
На входе дано беззнаковое целое ненулевой разрядности, допускающее все операции языка C для типа unsigned. На выходе должно быть bool.

Циклы, ясное дело, не приветствуются. Мой ответ пока заскринен.

[identity profile] psilogic.livejournal.com 2007-03-06 01:03 pm (UTC)(link)
value && (value & (value - 1))

[identity profile] myrix-et-al.livejournal.com 2007-03-06 01:31 pm (UTC)(link)
x & (x - 1) - обнуляем младший бит
Соответственно !( x & (x - 1) ) - в числе нет битов, кроме младшего, что нам и требуется

[identity profile] charon.livejournal.com 2007-03-06 02:10 pm (UTC)(link)
Ассемблерной вставкой: вычесть 1 и посмотреть флаг четности.

[identity profile] esyr.livejournal.com 2007-03-06 02:29 pm (UTC)(link)
А при чём здесь Си? Лично у нас подобные радости жизни на практикуме по ассемблеру были.

[identity profile] arifg.livejournal.com 2007-03-06 08:57 pm (UTC)(link)
О, это хорошая задача. Правда, когда я ее впервые услышал, условие было написать код из трех команд на ассемблере (включая условный переход), а не на С. У меня заняло где-то 15 минут, чем я был очень горд :)

[identity profile] sezam_lj.livejournal.com 2007-03-06 09:14 pm (UTC)(link)
Аппаратным логарифмированием :)

[identity profile] minimuk.livejournal.com 2007-03-07 04:00 am (UTC)(link)
!(value && 1) ?
Оставляем первый бит получаем нечетное число,
не_нечетно => четное