Рассмотрим ряд базовых задач на работу с битами числа. В качестве базового целочисленного типа будем использовать 32битный int.
Попрактиковаться можно здесь: задачи на битовые операции.
1. Обнулить последние i бит числа А
- A>>=i;
- A<<=i;
или
- A &= (~0)<<i;
2. 2^n - A = 1<<n;
3. 2^n + 2^m - if (n==m)
- A = 1<<(n+1);
- else
- A = 1<<n | 1<<m;
4. Установить i-ый бит числа A равным 1 - A |= (1<<i);
5. Инвертировать i-ый бит числа A - A ^= (1<<i);
6. Установить i-ый бит числа A равным 0 - A &= ~(1<<i);
7. Обнулить все кроме последних i битов числа A - A &= (1<<i) - 1;
8. Определить значение i-ого бита числа A - int IbitValue = (A>>i)&1;
9. Вывести значение байта побитно - for (int i=7;i>=0;i--)
- cout << (n>>i & 1);
10. Обнулить крайний правый единичный бит числа A - A &= A-1;
За этот пост отдельное спасибо!
ОтветитьУдалитьДавно хотел на все битовые операции в действии посмотреть :)
"A>>=i;
ОтветитьУдалитьA<<=i;"
Этим ты сдвинул на i бит вправо/влево, а не обнулил.
Ну как это : сдвинул вправо, младшие i разрядf пропали, сдвинул обратно влево - пропавшие разряды заполнились нулями.
Удалитьу тебя было число A = 1101 ты делаешь ему >>=2 получаешь 0011, потом делешь <<=2, получаешь 1100 - последние два бита занулены
ОтветитьУдалитьОчень доходчиво. Водопад благодарностей)
УдалитьСпасибо очень хорошие примеры))начинаю программировать под AVR)Там в основном это)
ОтветитьУдалитьда и правда ++ за пост, искал именно это
ОтветитьУдалить10. Обнулить крайний правый единичный бит числа A
ОтветитьУдалитьне вовсех случаях будет работать например в случае если у меня уже последни бит ноль то такая операцыя мне изменит байт
Пусть число A=14 (1110). Делаем операцию 14&13=12
УдалитьБыло: A = 1110 = 14
Стало: A` = 1100 = 12
Крайний правый единичный бит обнулен.
а... понял, думал что имеете ввиду вообще про крайний правый бит ;) Отличная статья!
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьСделать последний бит числа равным 1
ОтветитьУдалитьA |= 0x01;