psilogic: (Default)
[personal profile] psilogic
Как быстро проверить, является ли число степенью двойки?
На входе дано беззнаковое целое ненулевой разрядности, допускающее все операции языка C для типа unsigned. На выходе должно быть bool.

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

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

Date: 2007-03-07 07:11 am (UTC)
From: [identity profile] phantomer.livejournal.com
value = 8(dec) = 100(bin)

100 && (100 & 011) = false

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

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

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

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

Date: 2007-03-08 03:24 pm (UTC)

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

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

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

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

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

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

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

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

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

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

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

Date: 2007-03-06 10:17 pm (UTC)

Date: 2007-03-06 10:19 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Си способен на многое :)

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

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

Date: 2007-03-06 10:18 pm (UTC)

Date: 2007-03-07 04:00 am (UTC)
From: [identity profile] minimuk.livejournal.com
!(value && 1) ?
Оставляем первый бит получаем нечетное число,
не_нечетно => четное
Page generated Aug. 22nd, 2025 08:43 am
Powered by Dreamwidth Studios