воскресенье, 3 октября 2010 г.

Битовый операции

Рассмотрим ряд базовых задач на работу с битами числа. В качестве базового целочисленного типа будем использовать 32битный int.

Попрактиковаться можно здесь:
задачи на битовые операции.

1. Обнулить последние i бит числа А

  1. A>>=i;
  2. A<<=i;

или

  1. A &= (~0)<<i;
2. 2^n
  1. A = 1<<n;
3. 2^n + 2^m
  1. if (n==m)
  2.   A = 1<<(n+1);
  3. else
  4.   A = 1<<n | 1<<m;
4. Установить i-ый бит числа A равным 1
  1. A |= (1<<i);
5. Инвертировать i-ый бит числа A
  1. A ^= (1<<i);
6. Установить i-ый бит числа A равным 0
  1. A &= ~(1<<i);
7. Обнулить все кроме последних i битов числа A
  1. A &= (1<<i) - 1;
8. Определить значение i-ого бита числа A
  1. int IbitValue = (A>>i)&1;
9. Вывести значение байта побитно
  1. for (int i=7;i>=0;i--)
  2.   cout << (n>>i & 1);
10. Обнулить крайний правый единичный бит числа A
  1. A &= A-1;

9 комментариев:

  1. За этот пост отдельное спасибо!
    Давно хотел на все битовые операции в действии посмотреть :)

    ОтветитьУдалить
  2. "A>>=i;
    A<<=i;"

    Этим ты сдвинул на i бит вправо/влево, а не обнулил.

    ОтветитьУдалить
    Ответы
    1. Ну как это : сдвинул вправо, младшие i разрядf пропали, сдвинул обратно влево - пропавшие разряды заполнились нулями.

      Удалить
  3. у тебя было число A = 1101 ты делаешь ему >>=2 получаешь 0011, потом делешь <<=2, получаешь 1100 - последние два бита занулены

    ОтветитьУдалить
  4. Спасибо очень хорошие примеры))начинаю программировать под AVR)Там в основном это)

    ОтветитьУдалить
  5. да и правда ++ за пост, искал именно это

    ОтветитьУдалить
  6. 10. Обнулить крайний правый единичный бит числа A
    не вовсех случаях будет работать например в случае если у меня уже последни бит ноль то такая операцыя мне изменит байт

    ОтветитьУдалить
    Ответы
    1. Пусть число A=14 (1110). Делаем операцию 14&13=12

      Было: A = 1110 = 14
      Стало: A` = 1100 = 12

      Крайний правый единичный бит обнулен.

      Удалить
    2. а... понял, думал что имеете ввиду вообще про крайний правый бит ;) Отличная статья!

      Удалить