Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > установка/сброс бита


Автор: JS2 23.3.2010, 14:34
Код

procedure TForm8.Button3Click(Sender: TObject);
var
  N: Integer;
  A: packed array [0..3] of Byte absolute N;
  Res: Integer absolute A;
begin
  N := 76;

  A[0] := A[0] or $80;
  A[0] := A[0] or $40;

  ShowMessage(BoolToStr(A[0] and $80 = $80) + #13#10 +
    BoolToStr(A[0] and $40 = $40));

  A[0] := A[0] and (-1 xor $40);
  A[0] := A[0] and (-1 xor $80);

  ShowMessage(BoolToStr(A[0] and $80 = $80) + #13#10 +
    BoolToStr(A[0] and $40 = $40));

  ShowMessage(IntToStr(Res));
end;


Почему Res возвращает вместо 76 - 12? Что нет так? Ведь по сути установил бит/сбросил должно вернуть 76. 

Автор: Snowy 23.3.2010, 14:55
Потому что 76 = $4C
$4C or $40 = $4C
$4C and (-1 xor $4C) = $C
$C = 12
Ты не установил бит $40 - он уже был установлен.
А при снятии исчез...

Автор: JS2 23.3.2010, 15:05
подскажите как сделать нижеописанное, а то я совсем запутался с битами. Нужно для байта установить 1, 2 биты. Дальше записать изменненный байт в стрим. После считать байт со стрима и и проверить установки битов. Сбросить установленные биты, получить первоначальный байт.

Автор: Snowy 23.3.2010, 15:19
Всё верно, за исключением того, что первый и второй бит - это не $80 и $40, а 1 и 2
Только неясно, зачем потребовались абсолютные переменные.

Автор: JS2 23.3.2010, 15:25
Цитата(Snowy @ 23.3.2010,  15:19)
Всё верно, за исключением того, что первый и второй бит - это не $80 и $40, а 1 и 2
Только неясно, зачем потребовались абсолютные переменные.

лично для меня так проще разбить 4байтовое значение на массив 1байтовых

Автор: kami 23.3.2010, 23:19
Цитата(JS2 @  23.3.2010,  15:05 Найти цитируемый пост)
Нужно для байта установить 1, 2 биты...Сбросить установленные биты, получить первоначальный байт.

Условие поставлено некорректно. Если в байте 1 и (или) 2 биты были установлены (при задании числа), то их повторная установка (в ходе работы программы) ничего не даст, будет то же число. А вот сброс этих битов даст уже другой результат, отличный от первоначального. Задача по получению исходного числа после установки и сброса определенных битов нерешаема в поставленном контексте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)