обьясните как разделять на биты типы данных! |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
обьясните как разделять на биты типы данных! |
rum200 |
Сообщение
#1
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Cfif Репутация: 0 |
Раз элементы стека имеют тип байт, операция Push(a:byte) помещает в стек один байт, а функция Pop:byte извлекает байт из стека с соответствующим изменением в обеих случаях значения указателя. Для типа integer необходимо раздробить двухбайтовую переменную на два байте и дважды использовать Push, а при извлечении - склеить два последовательно извлеченных байта в одно
integer. Для longint аналогично, но работая с группами по 4 байта. Сообщение отредактировано: rum200 - |
Michael_Rybak |
Сообщение
#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 попробуй сам. |
andriano |
Сообщение
#3
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Раз элементы стека имеют тип байт, операция 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 - |
Текстовая версия | 11.10.2024 12:21 |