Лабораторная 2. Битовая структура данных

  1. На языке программирования freepascal разработать процедуру вывода на экран битовой структуры оперативной памяти:

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

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

    Пример программы, использующей данную процедуру:

    var x:word;
    begin
     x:=$04FE;
     bitform(@x,15);
    end.
    

    Результат работы программы:

    11111110 0000010
    
  2. На языке программирования Си разработать функцию bitForm, аналогичную предыдущей. Проверить ее работоспособность.

    void bitForm(unsigned char *adr, unsigned long bitCount);
    adr - указатель на начало анализируемого блока оперативной памяти
    bitCount - количество анализируемых битов
  3. На языке программирования freepascal разработать процедуры установки и сброса единичного бита в оперативной памяти:

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

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

    Пример программы, использующей данные процедуры:

    var x:word;
    begin
     x:=$04FE;
     bitform(@x,15);
    
     bitset(@x,0);
     bitform(@x,15);
    
     bitreset(@x,1);
     bitform(@x,15);
    
     bitset(@x,9);
     bitform(@x,15);
    end.
    

    Результат работы программы:

    11111110 0000010
    11111111 0000010
    11111101 0000010
    11111101 0000011
    
  4. На языке программирования Си разработать функции bitSet и bitReset, аналогичные предыдущим. Проверить их работоспособность.

    void bitSet(unsigned char *adr, unsigned long bitNumber);
    void bitReset(unsigned char *adr, unsigned long bitNumber);
    
    adr - указатель на начало блока оперативной памяти
    bitNumber - устанавливаемый или сбрасываемый бит
Пример решения заданий 1 и 3 для 64-разрядных ОС с использованием битовых массивов, запрещенных по условию задачи и модификацией типа одного из параметров разрабатываемых процедур:
{$mode objfpc}
type TBitArray=bitpacked array[0..high(longword)-1]of 0..1;

procedure bitForm(var data; bitCount:longword);
 var x:TBitArray absolute data;
     i,index:longint;
begin
 for i:=0 to bitcount-1 do begin
    index:=(7-(i mod 8))+8*(i div 8);
    write(x[index]);
    if ((i+1) mod 8)=0 then write(' ');
 end;
 writeln;
end;


procedure bitSet(var data; bitNumber:longword);
 var x:TBitArray absolute data;
begin
 x[bitNumber]:=1;
end;

procedure bitReset(var data; bitNumber:longword);
 var x:TBitArray absolute data;
begin
 x[bitNumber]:=0;
end;

var x:word;
begin
 x:=$04FE;
 bitform(x,15);

 bitSet(x,0);
 bitform(x,16);

 bitReset(x,7);
 bitform(x,16);

 bitSet(x,14);
 bitform(x,16); 
end.
Результат запуска программы:
11111110 0000010
11111111 00000100
01111111 00000100
01111111 01000100