Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизРазложить byte на биты Найти похожие ветки
← →
Piero © (2006-02-21 10:37) [0]Как разложить byte на массив битов? есть ли тип бит?
← →
RO (2006-02-21 10:40) [1]
> есть ли тип бит?
Нет
← →
tesseract © (2006-02-21 10:44) [2]Попробуй так:
function GetBit(value,bitno: integer): WordBool;
begin
result:=false;
if bitno>32 then exit;
if odd(value shr (bitno-1)) then result:=true else result:=false;
end;
← →
umbra © (2006-02-21 10:45) [3]типа бит нет. Чтобы узнатть значение конкретного бита надо пользоваться операцией
and
. Например, узнать, равен ли третий с конца бит в байте единице можно так.var
src, mask: byte;
{...........................}
mask := 4; //поскольку 4 в двоичном виде представляется как 100, то есть в третьем с конца разряде стоит единица
if byte and mask = 0 then //если в byte третий с конца бит равен 0
{..........................};
← →
RO (2006-02-21 10:46) [4]
> Как разложить byte на массив битов?
Никак.
Нет типа - нет и массива значений этого типа.
Но если ты опишешь задачу подробней, найдется масса решений.
← →
Amoeba © (2006-02-21 10:49) [5]Или так (ф-ия из библиотеки QStrings):
function Q_BitTest(P: Pointer; Index: Integer): Boolean;
asm
BT [EAX],EDX
SETC AL
end;
{ Q_BitSet устанавливает бит и возвращает True, если до этого бит уже был
установлен и False, если до этого бит был сброшен. Адрес битовой строки
передается параметром P. Смещение бита относительно начала строки задается
параметром Index. Самый первый бит строки имеет смещение ноль. Возможно
задание отрицательного индекса (смещения). }
← →
umbra © (2006-02-21 11:03) [6]я хотел сказать
var
src, mask: byte;
{...........................}
mask := 4; //поскольку 4 в двоичном виде представляется как 100, то есть в третьем с конца разряде стоит единица
if src and mask = 0 then //если в byte третий с конца бит равен 0
{..........................};
← →
Piero © (2006-02-21 11:10) [7]ff : array [1..8] of boolean;
k : byte;
mask1 := 1;
mask2 := 2;
mask3 := 4;
mask4 := 8;
mask5 := 16;
mask6 := 32;
mask7 := 64;
mask8 := 128;
if k and mask1=0 then ff[1]:=true;
if k and mask2=0 then ff[2]:=true;
.....
типа такого, наверное пойдет?
а сделать мне надо - прочитать структуру, которая ко мне приходит в таком сложном виде, сжатая для экономии каждого бита
← →
КаПиБаРа © (2006-02-21 11:11) [8]http://www.delphikingdom.com/lyceum/seminar.asp?ID=1
← →
tsa (2006-02-21 11:16) [9]
> if bitno>32 then exit;
bitno:=bitno and 31; //как в описании shr и без exit
← →
tesseract © (2006-02-21 11:28) [10]
> bitno:=bitno and 31; //как в описании shr и без exit
Ты получишь совсем не тот бит на который рассчитывал. Это защита от передачи бита больше 32 (integer).
Так из 43 получишь 11. И Что это даст?
← →
umbra © (2006-02-21 11:32) [11]если в структуре может быть только какой-то ограниченный набор значений, то можно заранее составлять маски для них. Например, если ожидается структура, выглядящая как 00010011, то можно составить для нее маску заранее
mask := 1 or 2 or 16;
← →
tesseract © (2006-02-21 11:36) [12]Для полного разложения байта потребуется 256 таких структур.
← →
umbra © (2006-02-21 11:39) [13]2 tesseract © (21.02.06 11:36) [12]
конечно. поэтому я и написал
> если в структуре может быть только какой-то ограниченный
> набор значений
← →
tsa (2006-02-21 11:49) [14]
> [10] tesseract © (21.02.06 11:28)
> Так из 43 получишь 11. И Что это даст?
Если двигать на 43 бита, то сдвинется на 11. Логика не нарушена.
Подобным образом отбрасывают 2*pi*n при вычислении sin
Представляешь, если бы ошибку давало - "угол слишком велик для вычисления синуса" :)
← →
RO (2006-02-21 11:55) [15]
> Piero © (21.02.06 11:10) [7]
Подсказка :
- байт - это множество, стостоящее из 8-ми бит;
- работа с множествами в Паскале представлена соответствующими операторами (см. оператор SET)
← →
Stakan © (2006-02-21 11:58) [16]Piero © (21.02.06 11:10) [7]
var
BitArr: array[0..7] of Boolean;
...
procedure FormArray(B: Byte);
var
I: Integer;
begin
for I := 0 to 7 do
BitArr[I] := ((B shr I) and 1) > 0;
end;
По моему что - то вроде этого
← →
Piero © (2006-02-21 13:07) [17]Stakan ©, спасибо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.02 c