замена единицу на нуль в битовом предствалении чесла.
От: Аноним  
Дата: 13.09.07 13:48
Оценка:
Добрый день.
как мне зделать такое.
замените последнию единицу в битовом предствалении числа на ноль. Примечение: не конкретый бит с единицей, а последний какой встретиться в заданом числе.
Re: замена единицу на нуль в битовом предствалении чесл
От: Bell Россия  
Дата: 13.09.07 13:51
Оценка: 2 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>как мне зделать такое.
А> замените последнию единицу в битовом предствалении числа на ноль. Примечение: не конкретый бит с единицей, а последний какой встретиться в заданом числе.

unsigned int n = ...;
n &= n-1;//Сбросить младший значащий бит
Любите книгу — источник знаний (с) М.Горький
Re[2]: замена единицу на нуль в битовом предствалении ч
От: Аноним  
Дата: 13.09.07 14:08
Оценка: -1 :)))
B>
B>unsigned int n = ...;
B>n &= n-1;//Сбросить младший значащий бит
B>

Вы не могли бы по подробнее обяснить эту строчку?n &= n-1
Re[2]: замена единицу на нуль в битовом предствалении ч
От: MightyMan  
Дата: 13.09.07 14:14
Оценка: -1 :))
Здравствуйте, Bell, Вы писали:


unsigned int n = 2;
n &= n-1;
printf("%u\n", n);


Пишет 0. А должно 2 по идее .
Re[3]: замена единицу на нуль в битовом предствалении ч
От: Bell Россия  
Дата: 13.09.07 14:18
Оценка:
Здравствуйте, Аноним, Вы писали:

B>>
B>>unsigned int n = ...;
B>>n &= n-1;//Сбросить младший значащий бит
B>>

А>Вы не могли бы по подробнее обяснить эту строчку?n &= n-1

Развернутый код:
n = n & (n-1);


Комментарий: к числу применяется операция "битовое 'и'", при этом в качестве второго операнда используется разность этого же числа и единицы. Результат операции записывается в исходную переменную.

Пример в двоичном коде:
n = 6;// 00000110
n2 = n-1;// n2 == 5 == 00000101
n = n2 & n;
           // 00000110
           //&
           // 00000101
           //---------
           // 00000100


Вроде достаточно подробно...
Любите книгу — источник знаний (с) М.Горький
Re[3]: замена единицу на нуль в битовом предствалении ч
От: Bell Россия  
Дата: 13.09.07 14:19
Оценка: 1 (1) +1 :))
Здравствуйте, MightyMan, Вы писали:

MM>
MM>unsigned int n = 2;
MM>n &= n-1;
MM>printf("%u\n", n);
MM>


MM>Пишет 0. А должно 2 по идее .

Это смотря по какой идее
Любите книгу — источник знаний (с) М.Горький
Re: замена единицу на нуль в битовом предствалении чесл
От: Sharp Eye Россия  
Дата: 13.09.07 14:20
Оценка: -1 :)
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>как мне зделать такое.
А> замените последнию единицу в битовом предствалении числа на ноль. Примечение: не конкретый бит с единицей, а последний какой встретиться в заданом числе.



int reset_last_bit(int digit)
{
    if(digit)
    {
        int mask = 0x80000000;

        while(!(mask & digit))
        {
            mask >>= 1;
        }
        return digit &= ~mask;
    }

    return 0;
}

//...


int digit = 7;

std::cout << reset_last_bit(digit) << std::endl; // выведет 3
Re[4]: замена единицу на нуль в битовом предствалении ч
От: MightyMan  
Дата: 13.09.07 14:34
Оценка: :)
MM>>Пишет 0. А должно 2 по идее .
B>Это смотря по какой идее

Ну вроде общепринятое понимание фразы "сбросить бит" означает "записать туда 0, не затрагивая остальные". Получается, этот код работает, только когда LSB установлен в 1, а в этом случае достаточно вычесть из него единицу.

На мой взгляд, правильнее было бы так:
unsigned int n = ...;
n &= unisgned int(-1) - 1;


А чтобы абстрагироваться от типа данных, еще и обернуть все это в шаблон.
Re[5]: замена единицу на нуль в битовом предствалении ч
От: Bell Россия  
Дата: 13.09.07 14:43
Оценка:
Здравствуйте, MightyMan, Вы писали:

MM>Ну вроде общепринятое понимание фразы "сбросить бит" означает "записать туда 0, не затрагивая остальные".

Именно так. Кто-то с этим спорил?

MM>Получается, этот код работает, только когда LSB установлен в 1, а в этом случае достаточно вычесть из него единицу.

Может быть нам посчастливится увидеть примеры некорректной работы?

MM>На мой взгляд, правильнее было бы так:

MM>
MM>unsigned int n = ...;
MM>n &= unisgned int(-1) - 1;
MM>


На мой взгляд, это совершенно не то, о чем шла речь в исходном посте.

Предлагаю вернуться к началу:

unsigned int n = 2;
n &= n-1;
printf("%u\n", n);

MM>>>Пишет 0. А должно 2 по идее .

Мне самому написать двоичное представление числа "2", и посчитать количество установленных битов, или Вы сделаете это сами?


MM>А чтобы абстрагироваться от типа данных, еще и обернуть все это в шаблон.
Любите книгу — источник знаний (с) М.Горький
Re[6]: замена единицу на нуль в битовом предствалении ч
От: MightyMan  
Дата: 13.09.07 14:46
Оценка:
B>Мне самому написать двоичное представление числа "2", и посчитать количество установленных битов, или Вы сделаете это сами?

Спасибо, дошло .
Re[3]: замена единицу на нуль в битовом предствалении ч
От: jazzer Россия Skype: enerjazzer
Дата: 13.09.07 14:47
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Вы не могли бы по подробнее обяснить эту строчку?n &= n-1

Вы не могли бы повнимательнее прочитать Ваш учебник по С++? Главу "Битовые операции"
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: замена единицу на нуль в битовом предствалении ч
От: kankan Украина  
Дата: 13.09.07 14:49
Оценка:
Здравствуйте, MightyMan, Вы писали:

MM>>>Пишет 0. А должно 2 по идее .

B>>Это смотря по какой идее

MM>Ну вроде общепринятое понимание фразы "сбросить бит" означает "записать туда 0, не затрагивая остальные". Получается, этот код работает, только когда LSB установлен в 1, а в этом случае достаточно вычесть из него единицу.


MM>На мой взгляд, правильнее было бы так:

MM>
MM>unsigned int n = ...;
MM>n &= unisgned int(-1) - 1;
MM>


MM>А чтобы абстрагироваться от типа данных, еще и обернуть все это в шаблон.


была задача сбросить последний установленный бит, а не самый младший
Re[2]: замена единицу на нуль в битовом предствалении ч
От: Аноним  
Дата: 13.09.07 14:51
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>unsigned int n = ...;
B>n &= n-1;//Сбросить младший значащий бит
B>


А точно этот бит последний? Может последний — старший.
Re[6]: замена единицу на нуль в битовом предствалении ч
От: MightyMan  
Дата: 13.09.07 14:54
Оценка: :)
K>была задача сбросить последний установленный бит, а не самый младший

Да понял уже.
Хотя все равно для ясности могли бы сказать, с какого конца последний .
Re: замена единицу на нуль в битовом предствалении чесл
От: Conr Россия  
Дата: 13.09.07 15:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>как мне зделать такое.
А> замените последнию единицу в битовом предствалении числа на ноль. Примечение: не конкретый бит с единицей, а последний какой встретиться в заданом числе.
Еще вариант:
n = ~(~n+1) & n;
Re[4]: замена единицу на нуль в битовом предствалении ч
От: alzt  
Дата: 14.09.07 03:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Комментарий: к числу применяется операция "битовое 'и'", при этом в качестве второго операнда используется разность этого же числа и единицы. Результат операции записывается в исходную переменную.


B>Пример в двоичном коде:

B>
B>n = 6;// 00000110
B>n2 = n-1;// n2 == 5 == 00000101
B>n = n2 & n;
B>           // 00000110
B>           //&
B>           // 00000101
B>           //---------
B>           // 00000100
B>


B>Вроде достаточно подробно...


Похоже начались занятия в вузах. Кое-где уже задания дали. Правда, честно признаться, я когда прочёл вопрос не догадался как его можно эффективно решить.
Re[3]: замена единицу на нуль в битовом предствалении ч
От: VoidEx  
Дата: 14.09.07 08:10
Оценка:
Здравствуйте, MightyMan, Вы писали:

MM>Здравствуйте, Bell, Вы писали:



MM>
MM>unsigned int n = 2;
MM>n &= n-1;
MM>printf("%u\n", n);
MM>


MM>Пишет 0. А должно 2 по идее .

Код конечно странноват, согласен, но по идее вообще-то должен был 1 на 0 поменять, а у вас там 0 на конце Так что GIGO (garbage in — garbage out).
Re[4]: замена единицу на нуль в битовом предствалении ч
От: VoidEx  
Дата: 14.09.07 08:12
Оценка:
А уж с учетом этого:
"была задача сбросить последний установленный бит, а не самый младший"
так и вообще правильно отработал
Re[2]: замена единицу на нуль в битовом предствалении ч
От: Кодт Россия  
Дата: 14.09.07 09:18
Оценка: +1
Здравствуйте, Conr, Вы писали:

C>Еще вариант:

C>
C>n = ~(~n+1) & n;
C>


В дополнительном коде ~(~n+1) тождественно (n-1).
Ну а с учётом коммутативности, n=x&n --> n=n&x --> n&=x



Вообще, удивительно, что такая простая задачка вызвала столько живых откликов и даже немножко флейма!
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: замена единицу на нуль в битовом предствалении ч
От: Bell Россия  
Дата: 14.09.07 09:23
Оценка:
Здравствуйте, Кодт, Вы писали:

К>

К>Вообще, удивительно, что такая простая задачка вызвала столько живых откликов и даже немножко флейма!

Вчера вечером это обсуждение очень здорово подняло мне настроение
Любите книгу — источник знаний (с) М.Горький
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.