Помощь - Поиск - Пользователи - Календарь
Полная версия: напечатать копию памяти в битовом виде
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Pukelis
Например, дана переменная
a:real;

мы ей присваиваем значение, скажем,
a:=25;

и ето надо представить в виде 101101 110011 ........
интегер вроде легче реализовать.. а как с реалом быть??

заранее спасибо! smile.gif
volvo
Только вот зачем это тебе - ума не приложу. Ничего даже отдаленно напоминающего 25 ты там все равно не увидишь...

function binary(x: longint; num_of_bits: byte): string;
var
s: string;
i, bit: byte;
begin
s := '';
for i := 0 to 31 do begin
bit := (x shl i) shr (31);
s := s + chr(ord('0') + bit)
end;
delete(s, 1, 32 - num_of_bits);
binary := s
end;

var
a: real;
type
arrbyte = array[1 .. maxint] of byte;

var
arr: arrbyte absolute a;
i: byte;
begin
a := 25;

for i := 1 to sizeof(a) do
write( binary(arr[i], 8) );
end.
Pukelis
Цитата(volvo @ 9.05.05 21:51)
Только вот зачем это тебе - ума не приложу. Ничего даже отдаленно напоминающего 25 ты там все равно не увидишь...

то есть? что-то не совсем понял, что ты етим в виду имеешь.. Да, я еще проверил, что прога выводит, если ей 1 подставить:

0000000000000000000000000000000000000000000000001111000000111111

ето нормально? мне тут друг, сидящий рядом, говорит, что должны быть все нули и тока одна единица..
volvo
А я знаю? Ты просил память распечатать, я распечатал :D
Цитата
мне тут друг, сидящий рядом, говорит, что должны быть все нули и тока одна единица..
Это почему это так? Это все-таки не LongInt. Тут же еще знаковые биты мантиссы, экспоненты, сама экспонента, "неприкасаемые биты"... Не все так просто... :no:
Pukelis
ок, панятна))

теперь несколько вопросов по самой ф-ции
В справке к паскалю пишут:
shl - logical shift left
shr - logical shift right
ето как понять? ;) что за логический сдвиг?

32 ето потому что 32 бита в 4 байтах...

delete(s, 1, 32 - num_of_bits);
binary := s

это мы обнуляем стринговые переменную и функцию?

absolute a - абсолют ето как я понял из справки - нужен для корректной работы с памятью? ;-)
SHnur
Цитата
arr: arrbyte absolute a;

говорит что arr это переменная типа arrbyte начинающаяся по адресу переменной a .

volvo , убрал ...
volvo
SHnur,
ссылки на форуме никто не отменял - уже есть пост, в котором описаны SHL и SHR - не надо плодить одинаковые объяснения (тем более, что оно у тебя далеко не полное) - просто даем ссылку...

N - ый бит
Pukelis
блин... только что попробовал отчитаться - так препод меня спросил
1) что за цифры 31 и 32.. они ему не понравились
здесь
for i := 0 to 31 do begin
и здесь d
elete(s, 1, 32 - num_of_bits);

2) что за цифра 8 тут
write( binary(arr[i], 8) );

3) а так же спрашивал зачем нужен longint тут:
function binary(x: longint; num_of_bits: byte): string;

4) и вообше он сказал, что в строке, которую печатает прога подозрительно много цифр! :p2:

что ответить - я не особо нашелся ((( объясните как ответить ему на ети вопросы!! Желательно в течение етого часа - пока он еще тут.. Ето последняя прога, которую мне надо сдать в етом году.. ;) ПЛИЗ!!!

А так же он просил указать, где в етих байтах содержится экспонента, знак, число и мантиса.. тоже бы хотелось узнать smile.gif дайте линк, хде ето написано!!
volvo
Цитата(Pukelis @ 13.05.05 13:32)
1) что за цифры 31 и 32.. они ему не понравились

А твой препод знает, сколько байт (и, соответственно, бит) содержится в переменной типа LongInt ? Вот от 0-го до 31-го и проходим по всем smile.gif
А потом удаляем все незначащие (в delete)

Цитата(Pukelis @ 13.05.05 13:32)
2) что за цифра 8 тут
write( binary(arr[i], 8) );

Ну, я же приводил к типу
type
arrbyte = array[1 .. maxint] of byte;

а в каждом байте 8 бит... Можно было привести к массиву Word-ов, тогда надо было бы делать:
write( binary(arr[i], 16) );


Цитата(Pukelis @ 13.05.05 13:32)
3) а так же спрашивал зачем нужен longint тут:
function binary(x: longint; num_of_bits: byte): string;

А чтобы работать с МАКСИМАЛЬНО возможной скоростью (которая достигается при обработке за один раз наибольшего числа бит)

Цитата(Pukelis @ 13.05.05 13:32)
4) и вообше он сказал, что в строке, которую печатает прога подозрительно много цифр!

А ты попроси его сказать, СКОЛЬКО она должна печатать? И какой размер у Real тоже уточни у него... И умножь на 8 байт.
Pukelis
а что про экспоненту, мантису и знак говорить? ;) что-то я ща в яндексе ничего не нашел путного про них(((
volvo
Порядок бит в Real такой:
Цитата
| 1 бит (знаковый) | 7 бит (экспонента) | 40 бит (мантисса) |
hiv
Volvo, под моим BP7 твоя программа выдала:
100001010000000000000000000000000000000001001000

у тебя наверно другой компилятор, в BP7 тип real занимает 6 байт или 48бит.
volvo
А что, у меня где-то сказано другое?
Вот что у меня выдается:
100001010000000000000000000000000000000001001000

А что касается автора темы - то надо у него спросить, какой у него компилятор... Уж очень длинное число у него печатается...
Pukelis
у мя freepascal, 8 байт соответственно.. Так и не сдал тогда. Ета зараза спрашивала, как формируется точка в экспоненте.. хде про ето почитать???
Pukelis
достал подобную прогу, правда она для extended формата.. хотя как я понимаю, если в 5-й строчке extended поменять на real, то она будет работать, вот тока надо как-то убрать лишние нули в начале (правда оно почему-то авдает совсем другие вещи, нежели то, что volvo мне накатал в самом начале) и я по-прежнему не фтыкаю в отображение мантисы в битовом виде (((


var
n, i, kiek:integer;
bitai:array[1..80] of byte;
mentise:array[1..80] of byte;
ext_sk: extended absolute bitai;
x:byte;
begin
repeat
n:=0;
i:=0;
kiek:=0;
write('Iveskite extended tipo skaiciu: ');
readln(ext_sk);
for i:=1 to sizeof(ext_sk) do
begin
x:=bitai[i];
for n:=1 to 8 do
begin
mentise[80-kiek]:=x mod 2;
x:= x div 2;
kiek:=kiek+1;
end;
end;
writeln('S Exp Mentise');
write(mentise[1], ' ');
for i:= 2 to 16 do
begin
write(mentise[i]);
end;
write(' ');
for i:=17 to 80 do write(mentise[i]);
readln(n);
until n=0;
end.
volvo
Цитата(Pukelis @ 18.05.05 21:06)
хотя как я понимаю, если в 5-й строчке extended поменять на real, то она будет работать

Да не будет она работать !!! У тебя здесь все построено на том, что Extended занимает 80 бит. Но Real - то занимает всего 48 ! Так что тебе все индексы менять придется...
hiv
Цитата
и я по-прежнему не фтыкаю в отображение мантисы в битовом виде (((

это зависит от реализации компилятора
Pukelis
у меня FPC.. там real 64 бита занимает, как double - мне так препод сказал.. Так что исправил все индексы, как советовал ув. Volvo и теперь оно выдает следующее:

5

0 100000000010100000000000000000000000000000000000000000000000000

-5

1 100000000010100000000000000000000000000000000000000000000000000

0.5

0 011111111100000000000000000000000000000000000000000000000000000

0.05

0 011111110101001100110011001100110011001100110011001100110011010

0.005

0 011111101110100011110101110000101000111101011100001010001111011

1-й бит - ето бит знака. 101 - ето 5 в битовом виде.. а остальное??? (((
volvo
Цитата(стандарт ANSI/IEEE Std 754-1985)
Для вещественных чисел используется нормализованное представление со смещенным порядком. То есть, во-первых, число приводится к виду

A = ±M*2^(±P),
1/2 <= M <= 1,

где M -- мантисса, P -- порядок. Так как в результате старший разряд числа всегда равен единице, его в памяти не хранят (<<скрытый бит>> или <<скрытая единица>>). Порядок хранится в смещенном коде (<<модифицированный порядок>>): P' = P+2n-1, где n -- число разрядов машинного представления порядка. Для представления нуля обнуляются все биты и мантиссы, и порядка

Стандарт IEEE определяет 4-, 8- и 10-байтовое представление вещественных чисел.

Real: 8 бит порядка, 23 бита мантиссы; диапазон примерно от ±1,2.10-38 (ненормализованные от ±1,5.10-45) до ±3,4.1038. Соответствует 7-8 значащим цифрам в десятеричном представлении.1

Double: 11 бит порядка, 52 бита мантиссы; диапазон примерно от ±2,2.10-308 (ненормализованные от ±5,0.10-324) до ±1,8.10308. Соответствует 15-16 значащим цифрам в десятеричном представлении

Extended: 15 бит порядка, 64 бита мантиссы; диапазон примерно от ±8.10-4933 (ненормализованные от ±3.10-4932) до ±6.104931. Соответствует 19-20 значащим цифрам в десятеричном представлении


Так лучше?
Pukelis
спасибо, надеюсь, теперь етого хватит smile.gif
Pukelis
сейчас посмотрел - прога корректно работает тока начиная с 4.. 1, 2 и 3 отображаются некорректно, 1 почему-то 100, 2 - 0, 3 - 10...
volvo
Давай договоримся, что ты будешь говорить "на моей машине с использованием моего компилятора..." Далее по тексту. Тебе уже сказали выше, что ОЧЕНЬ многое зависит от конкретной реализации компилятора (я уже не говорю об ОС). Ищи документацию и пиши "корректную программу".

Кстати, а откуда ты взял "правильные" значения? С чем ты сравниваешь? Ты учел нормализованное представление?

И еще одно. Это тебе не Integer, чтобы говорить что
Цитата
1 почему-то 100
и т.д. У тебя Real содержит не 3 бита, а 64 !!! Вот и не разбивай их на группы, если хочешь сравнить с чем-то, сравнивай все 64...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.