Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2013, 19:14   #1
deki
Новичок
Джуниор
 
Регистрация: 27.02.2013
Сообщений: 4
По умолчанию Битовая структура данных (PASCAL)

Битовая структура данных (PASCAL)
1) Разработать процедуру вывода на экран битовой структуры оперативной памяти:
procedure bitForm(adr: pointer; bitCount:longword);
adr - указатель на начало анализируемого блока оперативной памяти
bitCount - количество анализируемых битов

Биты должны выводиться группами по 8 штук через пробел, от старшего бита к младшему.
Если общее количество битов не кратно 8, то количество бит в последней группе будет меньше 8.
При создании процедуры разрешается использовать только порядковые типы данных

Пример программы, использующей данную процедуру:
var x:word;
begin
x:=$04FE;
bitform(@x,15);
end.

Результат работы программы:
11111110 0000010
Разработать процедуры установки и сброса единичного бита в оперативной памяти:
procedure bitSet(adr: pointer; bitNumber:longword);
procedure bitReset(adr: pointer; bitNumber:longword);
adr - указатель на начало блока оперативной памяти
bitNumber - устанавливаемый или сбрасываемый бит

Нумерация битов - от старшего к младшему.
При создании процедур разрешается использовать только порядковые типы данных



вот что у меня получилось :

{$mode objfpc}
function ByteToBit(b: byte): string;
var
i: integer;
begin
bytetobit:='';
while (b <> 0) do
begin
if b mod 2 = 0 then
bytetobit:='0'+bytetobit
else
bytetobit:='1'+bytetobit;
b:=b div 2;
end;
for i:=1 to 8-length(bytetobit) do bytetobit:='0'+bytetobit;
end;
procedure bitForm(adr: pointer; bitCount:longword);
var
k: ^byte;
i,byteCount: integer;
s: string;
begin
k:=adr;
s:='';
byteCount:=(bitCount div 8);
for i:=0 to byteCount do
begin
s:=s+ByteToBit(k^);
inc(k);
end;
for i:=1 to bitcount do
begin
if i mod 8 = 1 then write(' ');
write(s[i],'');
end;
end;

procedure bitreset(adr: Pinteger; bitnumber :longword);
begin
adr^:=adr^ and (not (1 shl (7-bitnumber )));
end;
var

x:qword;

begin
x:=$04fe;
bitform(@x, 15);
writeln;
bitreset(@x, 2);
bitForm(@x,15);
writeln(' ');
end.

Но , мне сказали , что я не правильно сбрасываю бит (соответственно в процедуре bitreset), подскажите , как ещё можно сбросить ? , заранее спасибо

Последний раз редактировалось deki; 27.02.2013 в 19:23.
deki вне форума Ответить с цитированием
Старый 27.02.2013, 20:30   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Чтобы сбросить бит надо провести операцию И над числом и маской из единиц, кроме одной, её можно получить по-разному - вычесть (1 shl bitnum) из 255 (или другого числа из всех установленных бит) или можно побитовым отрицанием, оно относительно независимо.
Код:
a := b and not (1 shl bitnum);
phomm вне форума Ответить с цитированием
Старый 27.02.2013, 21:09   #3
deki
Новичок
Джуниор
 
Регистрация: 27.02.2013
Сообщений: 4
По умолчанию

а можно , через div и mod , манипулировать битами ? первым набором бит (первым байтом ) я работаю легко, затруднение в том, что когда начинаю сбрасывать допустим 10 бит (нумерация от старшего к младшему ) здесь встает проблема, мне надо увеличить adr на еденицу , НО ! adr зависит от bitnumber , проблема в этом можно поподробнее объяснить? буду очень благодарен, хочу вникнуть ...
deki вне форума Ответить с цитированием
Старый 27.02.2013, 22:16   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Можно дивом и модом, но замороченно получится. Обычные битовые операции лучше , они для того и есть.
Ну а про адрес - я вообще с трудом понимаю, зачем с указателями работать. Не проще работать с интами ? Ну а коли надо с адресами - то вычитайте/добавляйте по 8. Лично я всегда работаю так, что байты идут справа налево - менее значащие справа. И сдвиг идёт именно так как есть. Было 128, сдвинули влево на 1 , и стало 256 и по идее в инт нормально должно записаться.
phomm вне форума Ответить с цитированием
Старый 28.02.2013, 10:50   #5
deki
Новичок
Джуниор
 
Регистрация: 27.02.2013
Сообщений: 4
По умолчанию

всё же надо через div и mod , через div найти байт, mod найти бит поможете?
deki вне форума Ответить с цитированием
Старый 28.02.2013, 13:28   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от deki Посмотреть сообщение
всё же надо через div и mod , через div найти байт, mod найти бит поможете?
Не нужно так делать.
Битовые операции - более элементарные, чем операции деления.
Пытаться сделать их через более высокоуровневую операцию деления примерно то же самое, что пытаться реализовать сложение через возведение в степень.
s-andriano вне форума Ответить с цитированием
Старый 28.02.2013, 20:22   #7
deki
Новичок
Джуниор
 
Регистрация: 27.02.2013
Сообщений: 4
По умолчанию

хорошо, тогда можно на наглядном примере , показать , как мне его сбросить , ведь я сделал так :
procedure bitreset(adr: Pinteger; bitnumber :longword);
begin
adr^:=adr^ and (not (1 shl (7-bitnumber )));
end;
НО! это не правильно как ещё можно то? выше , прочитанное , честно говоря не очень понятно чуть -чуть поконкретнее на примерах , можно объяснить ?
deki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура в Pascal tix0n Помощь студентам 3 30.06.2012 22:58
(Visual C++) Битовая обработка данных lamorena Помощь студентам 0 14.03.2012 21:34
битовая обработка данных osia18 Visual C++ 0 09.11.2011 21:28
структура данных в pascal Малой333 Помощь студентам 0 13.05.2011 09:08
[Pascal] Структура хранения и ведения следующих данных Бендер Помощь студентам 2 21.12.2010 09:48