IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> обьясните как разделять на биты типы данных!
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Cfif

Репутация: -  0  +


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

Сообщение отредактировано: rum200 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Смотри.

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

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

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

Помещение в стек:
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 попробуй сам.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(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.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.09.2020 13:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name