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

Вниз

Как проверить возведён-ли определённый бит или нет?   Найти похожие ветки 

 
Первый раз тут   (2003-02-20 02:54) [0]

По сути мне надо составить массив из элементов типа Boolean.У меня есть файл и я знаю, что число из пяти байт это битовое поле.Всего 40 бит, мне надо сделать массив.И желательно как потом перевести это обратно.Хотя бы просто, как проверить возведён-ли в еденицу определённый бит?

Ещё: можно-ли открыть файл как например "file of Boolean"?И как с ним работать?


 
jack128 ©   (2003-02-20 03:23) [1]

>>можно-ли открыть файл как например "file of Boolean"?И как с >>ним работать?
Можно. Так же как и с остальными типизиворанными файлами..

А получить значение бита ножно предлизительно так
(BitPos отсчитывать с нуля):
function GetBit(Data : pointer; BitPos : integer) : boolean;
var BytePos : integer;
begin
BytePos := BitPos div 8;
BitPos := 7 - BitPos mod 8;
Data := Pointer(Integer(Data)+BitPos);
Result := PByte(Data)^ and (1 shl BitPos);
end;


 
Хммм   (2003-02-20 03:52) [2]

>>можно-ли открыть файл как например "file of Boolean"?И как с >>ним работать?
Можно то можно, но врядли это то, что Вам нужно!
Думаю, что для сей задачи лучше всего подходит тип set.


 
jack128 ©   (2003-02-20 04:45) [3]

Опечяточка вышла.. Правельно так :

function GetBit(Data : pointer; BitPos : integer) : boolean;
var BytePos : integer;
begin
BytePos := BitPos div 8;
BitPos := 7 - BitPos mod 8;
Data := Pointer(Integer(Data)+BytePos);//Тут была опечатка
Result := (PByte(Data)^ and (1 shl BitPos)) <> 0;
end;


 
Первый раз тут   (2003-02-21 14:07) [4]

Не получается чего-то :( Ведь в эту функцию надо передавать Pointer как число и BitPos как номер бита?А у меня есть число размером в 5 байт типа integer(я их читаю из файла) и их надо читать именно как 5 байт это одно число, а не по одному байту иначе расположение битов будет другое и читать их будет неудобно.
Как мне сделать это?


 
REA ©   (2003-02-21 14:09) [5]

TBits есть класс, но как туда числа запихать не знаю. Может перегрузить чего.


 
MBo ©   (2003-02-21 14:27) [6]

>Первый раз тут
Надо читать книжки


procedure TForm1.Button1Click(Sender: TObject);
var
a: array[0..4] of byte;

function CheckBit(BitNum: byte): Boolean;
begin
Result := (a[BitNum shr 3] and (1 shl (7 - BitNum mod 8))) <> 0;
end;

procedure SetBit(BitNum: byte; Value: Boolean);
begin
if Value then
a[BitNum shr 3] := a[BitNum shr 3] or (1 shl (7 - BitNum mod 8))
else
a[BitNum shr 3] := a[BitNum shr 3] and not (1 shl (7 - BitNum mod 8))
end;

begin
a[1] := $4;
SetBit(16, True);
SetBit(17, True);//установим
SetBit(17, False);//и сбросим
Caption := inttostr(a[2]) + " " + IntToStr(Ord(CheckBit(13)));
end;




Страницы: 1 вся ветка

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
3-5390
Alexanders
2003-02-03 15:42
2003.03.03
БД в интернет


9-5374
greenrul
2002-09-26 19:03
2003.03.03
Столкновения


14-5869
gn
2003-02-14 07:34
2003.03.03
фишка реальная


9-5369
][рюн
2002-09-29 20:33
2003.03.03
В чем лучше хранить спрайты? (DelphiX)


14-5737
Profesor
2003-02-14 20:23
2003.03.03
Клава