Главная страница
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.022 c
14-5843
Кот Бегемот
2003-02-12 17:11
2003.03.03
Потрясающе :) Какие же красивые девушки у нас в стране.


14-5718
Дмитрий К.К.
2003-02-14 06:23
2003.03.03
Именинники 14 февраля


14-5866
Axis_of_Evil
2003-02-14 09:12
2003.03.03
IIS


4-5910
Nick_N_A
2003-01-15 07:39
2003.03.03
ActiveX


3-5396
Джоник
2003-02-12 12:15
2003.03.03
Проблема одновременного добавления записей в БД с разных компов