C - прикол
Mar. 6th, 2007 03:50 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как быстро проверить, является ли число степенью двойки?
На входе дано беззнаковое целое ненулевой разрядности, допускающее все операции языка C для типа unsigned. На выходе должно быть bool.
Циклы, ясное дело, не приветствуются. Мой ответ пока заскринен.
На входе дано беззнаковое целое ненулевой разрядности, допускающее все операции языка C для типа unsigned. На выходе должно быть bool.
Циклы, ясное дело, не приветствуются. Мой ответ пока заскринен.
no subject
Date: 2007-03-06 01:03 pm (UTC)no subject
Date: 2007-03-07 07:11 am (UTC)100 && (100 & 011) = false
Наверное имелось в виду: value && !(value & (value-1))
Но поюзанное свойство мне очень понравилось. Действительно, тольуо у степени двойки при декременте обнуляется старший бит. У прочих чисел он остаётся установленным. Респект.
no subject
Date: 2007-03-07 04:59 pm (UTC)no subject
Date: 2007-03-08 12:09 pm (UTC)no subject
Date: 2007-03-08 03:24 pm (UTC)no subject
Date: 2007-03-06 01:31 pm (UTC)Соответственно !( x & (x - 1) ) - в числе нет битов, кроме младшего, что нам и требуется
no subject
Date: 2007-03-06 01:41 pm (UTC)осталось исправить баг: ноль - не степень двойки, а он под эту формулу подходит
no subject
Date: 2007-03-07 08:41 am (UTC)!( x & (x - 1) ) && x
no subject
Date: 2007-03-07 04:59 pm (UTC)no subject
Date: 2007-03-06 02:10 pm (UTC)no subject
Date: 2007-03-06 02:17 pm (UTC)no subject
Date: 2007-03-06 02:22 pm (UTC)no subject
Date: 2007-03-06 02:30 pm (UTC)no subject
Date: 2007-03-06 02:38 pm (UTC)no subject
Date: 2007-03-06 02:29 pm (UTC)no subject
Date: 2007-03-06 04:09 pm (UTC)no subject
Date: 2007-03-06 10:17 pm (UTC)no subject
Date: 2007-03-06 10:19 pm (UTC)no subject
Date: 2007-03-06 08:57 pm (UTC)no subject
Date: 2007-03-06 09:14 pm (UTC)no subject
Date: 2007-03-06 10:18 pm (UTC)no subject
Date: 2007-03-07 04:00 am (UTC)Оставляем первый бит получаем нечетное число,
не_нечетно => четное