![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 27.02.2013
Сообщений: 4
|
![]()
Битовая структура данных (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. |
![]() |
![]() |
![]() |
#2 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Чтобы сбросить бит надо провести операцию И над числом и маской из единиц, кроме одной, её можно получить по-разному - вычесть (1 shl bitnum) из 255 (или другого числа из всех установленных бит) или можно побитовым отрицанием, оно относительно независимо.
Код:
|
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 27.02.2013
Сообщений: 4
|
![]()
а можно , через div и mod , манипулировать битами ? первым набором бит (первым байтом ) я работаю легко, затруднение в том, что когда начинаю сбрасывать допустим 10 бит (нумерация от старшего к младшему ) здесь встает проблема, мне надо увеличить adr на еденицу , НО ! adr зависит от bitnumber , проблема в этом
![]() |
![]() |
![]() |
![]() |
#4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Можно дивом и модом, но замороченно получится. Обычные битовые операции лучше , они для того и есть.
Ну а про адрес - я вообще с трудом понимаю, зачем с указателями работать. Не проще работать с интами ? Ну а коли надо с адресами - то вычитайте/добавляйте по 8. Лично я всегда работаю так, что байты идут справа налево - менее значащие справа. И сдвиг идёт именно так как есть. Было 128, сдвинули влево на 1 , и стало 256 и по идее в инт нормально должно записаться. |
![]() |
![]() |
![]() |
#5 |
Новичок
Джуниор
Регистрация: 27.02.2013
Сообщений: 4
|
![]()
всё же надо через div и mod , через div найти байт, mod найти бит поможете?
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Битовые операции - более элементарные, чем операции деления. Пытаться сделать их через более высокоуровневую операцию деления примерно то же самое, что пытаться реализовать сложение через возведение в степень. |
|
![]() |
![]() |
![]() |
#7 |
Новичок
Джуниор
Регистрация: 27.02.2013
Сообщений: 4
|
![]()
хорошо, тогда можно на наглядном примере , показать , как мне его сбросить , ведь я сделал так :
procedure bitreset(adr: Pinteger; bitnumber :longword); begin adr^:=adr^ and (not (1 shl (7-bitnumber ))); end; НО! это не правильно ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Структура в 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 |