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] phantomer.livejournal.com 2007-03-07 07:11 am (UTC)(link)
value = 8(dec) = 100(bin)

100 && (100 & 011) = false

Наверное имелось в виду: value && !(value & (value-1))

Но поюзанное свойство мне очень понравилось. Действительно, тольуо у степени двойки при декременте обнуляется старший бит. У прочих чисел он остаётся установленным. Респект.

[identity profile] psilogic.livejournal.com 2007-03-07 04:59 pm (UTC)(link)
Ахха, что-то типа того. Еще бы от логических операций типа "&&" уйти... это же условный переход по идее

[identity profile] phantomer.livejournal.com 2007-03-08 12:09 pm (UTC)(link)
Попарил моск. Без явного или косвенного сравнения не придумалось.

[identity profile] psilogic.livejournal.com 2007-03-08 03:24 pm (UTC)(link)
:))

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

[identity profile] psilogic.livejournal.com 2007-03-06 01:41 pm (UTC)(link)
гут! :)
осталось исправить баг: ноль - не степень двойки, а он под эту формулу подходит

[identity profile] sphinks82.livejournal.com 2007-03-07 08:41 am (UTC)(link)
ну этот баг легко убирается вроде:
!( x & (x - 1) ) && x

[identity profile] psilogic.livejournal.com 2007-03-07 04:59 pm (UTC)(link)
угумс :)

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

[identity profile] psilogic.livejournal.com 2007-03-06 02:17 pm (UTC)(link)
смотря что этот флаг показывает...

[identity profile] charon.livejournal.com 2007-03-06 02:22 pm (UTC)(link)
четность операции.

[identity profile] charon.livejournal.com 2007-03-06 02:30 pm (UTC)(link)
а, нет. Вру.

[identity profile] charon.livejournal.com 2007-03-06 02:38 pm (UTC)(link)
надо не вычитать, надо делить.

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

[identity profile] sillykong.livejournal.com 2007-03-06 04:09 pm (UTC)(link)
С - символический ассемблер. )

[identity profile] psilogic.livejournal.com 2007-03-06 10:17 pm (UTC)(link)
гы :)

[identity profile] psilogic.livejournal.com 2007-03-06 10:19 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] psilogic.livejournal.com 2007-03-06 10:18 pm (UTC)(link)
=))

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