LINUX.ORG.RU

Битовые операции: обнулить младшие биты числа


0

2

Разминка для МОЗГа.

Как с помощью битовых операций | & ~ и скобок обнулить все младшие биты числа. Т.е., например, в результате данного преобразования, число 0b10101111 должно превратиться в 0b10000000. Число от 0 до 2^64-1.

Если такое вообще реально. Условные операторы использовать нельзя.

Upd.:Сдвиги использовать можно. Забыл сказать

★★★★★

Последнее исправление: ttnl (всего исправлений: 1)
Ответ на: комментарий от twosev

> if (x) x = 1 << uint64_highest_bit_pos(x);

Тогда уж x&=1 << uint64_highest_bit_pos(x);

madcore ★★★★★
()
Ответ на: комментарий от twosev

Красивое решение, правильное, молодец! Умеем читать hackers delight:)

anonymous
()
Ответ на: комментарий от Eddy_Em

В версии для x86_64 единственное условие можно записать неявно в виде побитовой конъюнкции (последнее предложение madcore). Ну, а вообще, никто не говорил и про возможность использования bsr. :)

twosev ★★
()
Ответ на: комментарий от ntp

имелась в виду замена операций ~ и & на одну операцию вычитания в последней строке предложенного решения

unC0Rr ★★★★★
()

| & ~ и скобок обнулить все младшие биты числа

по-моему в Hacker's Delight писали, что нельзя

pseudo-cat ★★★
()
Ответ на: комментарий от Led

Странно, что get_order реализован не через них

ttnl ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.