Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> !(a&(a-1)) 
:(
    Опции темы
leniviy
Дата 30.6.2012, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Уже несколько раз видел подобное:
Цитата
Алгоритм проверки числа на степень 2.

Код

int isPow2(int a) {
  return !(a&(a-1));
}



В чём суть, я не понимаю.

Это сообщение отредактировал(а) leniviy - 30.6.2012, 16:42
PM MAIL   Вверх
disputant
Дата 30.6.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



x&(x-1) обнуляет крайний справа единичный бит. Если результат равен 0 - значит, x имеет вид 1000...000, т.е. представляет собой степень 2.
PM MAIL   Вверх
borisbn
Дата 30.6.2012, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



для нуля не будет работать


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 30.6.2012, 18:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(leniviy @  30.6.2012,  17:40 Найти цитируемый пост)
В чём суть, я не понимаю.

А Вы представьте себе, что будет, если исследуемое число есть степень двойки и не есть степень двойки.

Возьмём беззнаковое ненулевое число в побитовой записи: 1xxx...xxx, где xxx - какие-то биты.

Если это число - не степень двойки, то хотя бы один бит из xxx...xxx будет отличен от нуля, и при вычитании единицы из исследуемого числа получим число вида 1yyy...yyy, то есть самая старшая единичка остаётся на своём месте. Следовательно, в этом случае a & (a-1) всегда даст ненулевой результат, какими бы не были xxx...xxx.

Если наше число - степень двойки, то оно в побитовой записи имеет вид 1000...000, при вычитании 1 получаем 0111...111. При этом старший бит обнуляется, а там где возникли единичные биты, у оригинального числа - нули. В результате, a & (a-1) даст 0.

Предлагаю самостоятельно разобраться, что будет, если взять нулевое число или знаковое число с отрицательным значением smile 

Это сообщение отредактировал(а) feodorv - 30.6.2012, 18:39


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
NoviceF
Дата 30.6.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(feodorv @ 30.6.2012,  18:21)
Цитата(leniviy @  30.6.2012,  17:40 Найти цитируемый пост)
В чём суть, я не понимаю.

А Вы представьте себе, что будет, если исследуемое число есть степень двойки и не есть степень двойки.

Возьмём беззнаковое ненулевое число в побитовой записи: 1xxx...xxx, где xxx - какие-то биты.

Если это число - не степень двойки, то хотя бы один бит из xxx...xxx будет отличен от нуля, и при вычитании единицы из исследуемого числа получим число вида 1yyy...yyy, то есть самая старшая единичка остаётся на своём месте. Следовательно, в этом случае a & (a-1) всегда даст ненулевой результат, какими бы не были xxx...xxx.

Если наше число - степень двойки, то оно в побитовой записи имеет вид 1000...000, при вычитании 1 получаем 0111...111. При этом старший бит обнуляется, а там где возникли единичные биты, у оригинального числа - нули. В результате, a & (a-1) даст 0.

Предлагаю самостоятельно разобраться, что будет, если взять нулевое число или знаковое число с отрицательным значением smile

Спасибо, познавательно smile
PM MAIL   Вверх
Silent
Дата 3.7.2012, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



Можете посмотреть книгу - Генри Уоррен, Алгоритмические трюки для программистов, там много такого рода интересностей, которые иногда могут дать существенный прирост производительности.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.