#c #delphi #битовые_операции
Здравствуйте. Как получить значение определенного бита в байте? Допустим мы имеем байт с битами вида: 00110101 Как можно получить значение 4 или 5 бита? Пример можно показать на любом языке, предпочтительнее C или Delphi.
Ответы
Ответ 1
Если вас интересует буквальное значение бита (т.е. 0 или 1), то в языке С значение i-того бита числа n можно получить как (n >> i) & 1u Если вас интересует взвешенное значение бита (т.е. 0 или 8 для бита номер 3), то в языке С значение i-того бита числа n можно получить как n & (1u << i) (Подразумевается нумерация с нуля от младших битов к старшим.)Ответ 2
Функция на Delphi для проверки, установлен ли конкретный бит в 32-х битном числе: function IsBitSet(const AValue: Cardinal; const ABit: Byte): Boolean; begin Result := (AValue and (1 shl ABit)) <> 0; end; Операция (1 shl ABit) (порязрядный сдвиг значения целого числа влево, на указанное число бит) генерирует число, в котором установлен в 1 только один бит именно в той позиции которая нас интересует. Это число называется маской. Далее, применяется логическая операция AND к входному значению и маске, в результате чего получается ещё одно число, которое либо равно 0 (все биты установлены в 0), либо равно маске, т.е. установлен только один бит. Соответственно, сравнив результат с нулём можно сделать вывод о том, установлен искомый бит или нет. Картинка, поясняющая работу логической операции AND: Результирующий бит считается установленным только если у обоих операндов соответствующий бит так же установлен. В вашем примере, при поиске 4-го бита, будет производится вот такое сложение: 00110101 - входное значение 00001000 - маска -------- 00000000 - результат = 0, т.е 4-й бит не установлен
Комментариев нет:
Отправить комментарий