Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Разложить 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.064 c
15-1139951775
ArtemESC
2006-02-15 00:16
2006.03.12
Компиляторы...


8-1128180544
alsov
2005-10-01 19:29
2006.03.12
Как программно сделать mute


15-1140181761
Mirror
2006-02-17 16:09
2006.03.12
Jpeg2000


2-1141033977
Azeem
2006-02-27 12:52
2006.03.12
Буфер обмена


3-1137594058
jack128
2006-01-18 17:20
2006.03.12
особенности работы left join