Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.016 c
3-1137195418
001
2006-01-14 02:36
2006.03.12
Как мне связать 3 таблицы?


5-1126707425
lookin
2005-09-14 18:17
2006.03.12
Компонент в dcu...


2-1140597616
BigLoy
2006-02-22 11:40
2006.03.12
TMemoryStream


15-1140197456
Ученик чародея
2006-02-17 20:30
2006.03.12
Как можно уменьшить сложность разработки больших комплексов.


2-1140570136
Bogdan1024
2006-02-22 04:02
2006.03.12
Скомандовать виндовс открыть файл.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский