Правильно, должны быть проверены границы для n == 0 и n <MAXINT (или любой другой правильной константы для этого) По крайней мере, я правильно интерпретировал вопрос

жные дубликаты:
Как вы устанавливаете, очищаете и переключаете один бит в C?
Удаление младшего разряда

n является положительным целым числом. Как можно установить его самый правый установленный бит?

Сказатьn= 7 => n = 0111. Я хочу0110 в качестве выхода. Есть ли простой побитовый хак для достижения цели?

Ответы на вопрос(3)

unsigned int clr_rm_set_bit(unsigned int n)
{
    unsigned int mask = 1;
    while(n & mask) {
        mask <<= 1;
    }
    return n & ~mask;
}
 Mike DeSimone16 янв. 2011 г., 06:47
Это O (N), в то время как у Prasoon есть O (1). Кроме того, вы хотите что-то более похожееwhile(!(n & mask)), но даже это не работает дляn = 0.
 Joe W16 янв. 2011 г., 06:56
Правильно, должны быть проверены границы для n == 0 и n <MAXINT (или любой другой правильной константы для этого) По крайней мере, я правильно интерпретировал вопрос
 Artelius16 янв. 2011 г., 06:56
На самом деле этот метод (при правильной реализации) неO(n), ЭтоO(log(n)), И поскольку n ограничено размером беззнакового целого, вы также можете назвать его O (1).

Если вы просто хотите сбросить бит 0, вот несколько методов (с небольшими различиями в поведении в зависимости от ваших типов):

x &= -2;
x &= ~1;
x -= (x&1);

Если вы хотите сбросить младший бит среди установленных битов, вот несколько способов:

x &= x-1;
x -= (x&-x);

Обратите внимание, чтоx&-x равен младшему битуxпо крайней мере, когдаx без знака или дополнения до двух. Если вы хотите выполнить какую-либо битовую арифметику, как это, вы должны использовать только неподписанные типы, поскольку подписанные типы имеют поведение, определяемое реализацией при побитовых операциях.

 Matthew Flaschen16 янв. 2011 г., 06:48
«бит справа» кажется совершенно ясным. Это был просто неудачно выбранный пример.

Пытатьсяn & (n-1) где& являетсяпобитовое И

n = 7
n - 1 =6

n & (n-1)=> 0 1 1 1   (7)
          & 0 1 1 0   (6)
           --------- 
            0 1 1 0  (done!)

РЕДАКТИРОВАТЬ (в ответ на комментарий, данный Форестом)

n = 6 
n - 1 = 5

n & (n-1)=> 0 1 1 0   (6)
          & 0 1 0 1   (5)
           --------- 
            0 1 0 0  (done!)
 Dawson16 янв. 2011 г., 06:45
+1 Здорово! Я до сих пор не понимаю, как люди так быстро видят подобные решения.
 Prasoon Saurav16 янв. 2011 г., 06:38
@taspeotis: Проверьте вопрос еще раз: «Как это может быть самым правымустановлен немного быть сброшенным? "
 ergosys16 янв. 2011 г., 06:54
@Toolbox см. Восхищение Хакера (книга)
 ʇsәɹoɈ16 янв. 2011 г., 06:41
О да. Я упустил из виду слово «набор».
 Artelius16 янв. 2011 г., 06:51
@Toolbox: Либо мы видели их раньше, либо провели детство, изобретая их. Для меня это немного и того и другого.

Ваш ответ на вопрос