Вычисление самого высокого питания 2, который равномерно делит число на C

Принятие Вас имеет правильные полномочия:

SELECT *
FROM yourdatabasename.sys.all_objects
WHERE upper(name) like upper('my prefix%')  --use UPPER for case-INsensitivity
8
задан tostao 26 December 2012 в 21:15
поделиться

3 ответа

Если вы готовы принять арифметику с дополнением до 2:

x & -x

Если вы много занимаетесь подобными вещами (или даже если вам это просто интересно) , найдите себе копию книги "Hacker's Delight".

edit: avakar правильно отмечает, что это не зависит от дополнения до 2, если тип беззнаковый. Соответствующий раздел стандарта - это §6.2.5, параграф 9:

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

«на единицу больше наибольшего значения» оставляет некоторое пространство для маневра для особенно извращенной реализации (в частности, реализации, которая, например, не использует двоичный код), но вы вряд ли столкнетесь с этим.

19
ответ дан 3 November 2019 в 12:49
поделиться

Без использования арифметики с плавающей запятой:

((x ^ (x - 1)) >> 1) + 1

Упрощение и крайние случаи оставлены как упражнения для читатель.

7
ответ дан 3 November 2019 в 12:49
поделиться

Мы можем заменить (- x) на (~ x + 1) :

x & (~x+1) 

Низкоуровневые битовые хаки, которые вы обязательно должны знать дает подробное объяснение.

7
ответ дан 3 November 2019 в 12:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: