Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ обьясните как разделять на биты типы данных!

Автор: rum200 23.12.2007 5:27

Раз элементы стека имеют тип байт, операция Push(a:byte) помещает в стек один байт, а функция Pop:byte извлекает байт из стека с соответствующим изменением в обеих случаях значения указателя. Для типа integer необходимо раздробить двухбайтовую переменную на два байте и дважды использовать Push, а при извлечении - склеить два последовательно извлеченных байта в одно
integer. Для longint аналогично, но работая с группами по 4 байта.

Автор: Michael_Rybak 23.12.2007 6:04

Смотри.

Представь себе, что у тебя органичение - не в двоичной системе, а в десятичной.

А именно - стек принимает трехзначные десятичные числа, а тебе нужно записать туда шестизначное, и потом извлечь.

Это понятно как делать - сначала три нижних разряда, потом - три верхних:

Помещение в стек:
Push(x mod 1000);
Push(x div 1000);

Извлечение:
x := Pop();
x := x + 1000 * Pop();

Почему 1000? Потому, что 1000 - это 10 в кубе: 10, потому что это основание десятичное системы счисления, а в кубе - потому что нам нужны три цифры.

Теперь смотрим, какая задача у тебя. Что такое байт? Это восемь бит. Переменная, занимающая один байт - это попросту восьмизначное *двоичное* число. А тебе нужно работать с шестнадцатизначным.

Поступаем совершенно аналогично - сначала нижние 8 бит, потом - верхние:

Помещение в стек:
Push(x mod 256);
Push(x div 256);

Извлечение:
x := Pop();
x := x + 256 * Pop();

Почему 256? Потому, что 256 - это 2 в восьмой: 2, потому что это основание двоичной системы счисления, а в восьмой - потому что нам нужно 8 бит.

Для longint попробуй сам.

Автор: andriano 23.12.2007 15:57

Цитата(rum200 @ 23.12.2007 1:27) *

Раз элементы стека имеют тип байт, операция Push(a:byte) помещает в стек один байт, а функция Pop:byte извлекает байт из стека с соответствующим изменением в обеих случаях значения указателя. Для типа integer необходимо раздробить двухбайтовую переменную на два байте и дважды использовать Push, а при извлечении - склеить два последовательно извлеченных байта в одно
integer. Для longint аналогично, но работая с группами по 4 байта.

Вообще-то я не вижу ничего общего между заголовком и телом темы.

По поводу заголовка:
биты извлекаются из числа соответствующими логическими операциями, например, бит номер n (начиная с 0):
MyBit := (MyNumber shr n) and 1;
Обратно возвратить бит в число можно, например, так:
MyNumber := (MyNumber and (not(1 shl n)) or (MyBit shl n);

По поводу тела:
Во-первых, никто не ограничивает длину объекта, с которым работает стек именно 1 байтом. Если стек реализуется ручками на ЯВУ, то заихиваь можно хоть строки переменной длины.
Если же речь идет о языке Ассемблера, то разрядность запихиваемого числа равняется разрядности АЛУ, т.е. для 16-разрядных процессоров запихиваться будет 2 байта, для 32-разрядых - 4, а 64-разрядных - 8.