IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Битовые флаги (http://www.imho.ws/showthread.php?t=62364)

/7y3uK 22.06.2004 21:55

Битовые флаги
 
Подскажите ПЛЗ! Как устроены битовые флаги?
Каким образом в Delphi можно читать/записывать битовые флаги?
И вообще - как в Delphi можно работать с отдельными БИТами, если при чтении потока он выхватывает целиком байт. Например если я хочу прочитать и вывести на Canvas черно-белую BMP-шку (сам ручками без встроеных методов), то там за цвет отвечает БИТ 1-черный - 0-белый (или наоборот :)), соответственно в сканлайн нужно засунуть число битов равное ширине картинки.

is_absent 28.06.2004 20:40

Посмотри, может поможет чем...
Код:

Const
Bit0 = 1;
Bit1 = 2;
Bit2 = 4;
Bit3 = 8;
Bit4 = 16;
Bit5 = 32;
Bit6 = 64;
Bit7 = 128;
Bit8 = 256;
Bit9 = 512;
Bit10 = 1024;
Bit11 = 2048;
Bit12 = 4096;
Bit13 = 8192;
Bit14 = 16384;
Bit15 = 32768;

procedure SetBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord or BitNum;    { Устанавливаем бит }
end;

procedure ClearBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord or BitNum;    { Устанавливаем бит }
  SetWord:= SetWord xor BitNum;    { Переключаем бит  }
end;

procedure ToggleBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord xor BitNum;    { Переключаем бит  }
end;

function GetBitStat(SetWord, BitNum: Word) : Boolean;
begin
  GetBitStat:= SetWord and BitNum = BitNum { Если бит установлен }
end;

если не хочешь мучиться с константами, то везде BitNum понимать как порядковй номер бита и заменить его на (1 shl BitNum).. так даже красивше вроде.. :)

/7y3uK 28.06.2004 21:13

Пасибки !! Тока всеравно не понятно как работает :) буду разбираться...

V@nya 29.06.2004 13:27

Цитата:

Тока всеравно не понятно как работает
Там всё понятно, используются обычные логические функции, попробуй эти функции разобрать карандашом на бумаге, и увидишь, что всё работает

CEO 02.07.2004 17:55

В Delphi есть специальный класс для работы с битами -- TBits. Пример можно посмортеть:
http://www.lib.csu.ru/dl/bases/prg/k...12_upravlenie/

is_absent 03.07.2004 20:34

ceo
извини.. но это же тоже, что и я писал..... я не ругаюсь.. просто присмотрись :)

CEO 06.07.2004 18:46

Цитата:

is_absent :
извини.. но это же тоже, что и я писал.....
Таки да, извиняюс за плагиат.

ARTi 07.07.2004 02:38

Цитата:

везде BitNum понимать как порядковй номер бита и заменить его на (1 shl BitNum)
Imho только так. Бит - это бит, и работать с ним косвенно при помощи
Код:

procedure SetBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord or BitNum;    { Устанавливаем бит }
end;

procedure ClearBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord or BitNum;    { Устанавливаем бит }
  SetWord:= SetWord xor BitNum;    { Переключаем бит  }
end;

procedure ToggleBit(SetWord, BitNum: Word);
begin
  SetWord:= SetWord xor BitNum;    { Переключаем бит  }
end;

function GetBitStat(SetWord, BitNum: Word) : Boolean;
begin
  GetBitStat:= SetWord and BitNum = BitNum { Если бит установлен }
end;

очень некрасиво по той лишь простой причине, что у любого процессора есть встроенные средства для работы с битами и битовыми полями. Неиспользование этих средств, работа с битами при помощи структур, превращающихся в целые функции, - тогда как можно сделать это и одной специализированной командой процессора (естественно, так это будет выглядеть после компиляции), - богохульство ;), либо очень и очень исключительный случай (спецзадача).

helldomain 07.07.2004 05:04

Absoliutno soglasen s utwerjdeniem. Wozmojnoe iskliuchenie: specialnie arhitekturi, wozmojnij primer: JVM.

Цитата:

ARTi:
очень некрасиво по той лишь простой причине, что у любого процессора есть встроенные средства для работы с битами и битовыми полями. Неиспользование этих средств, работа с битами при помощи структур, превращающихся в целые функции, - тогда как можно сделать это и одной специализированной командой процессора (естественно, так это будет выглядеть после компиляции), - богохульство , либо очень и очень исключительный случай (спецзадача).


Часовой пояс GMT +4, время: 22:35.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.