Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 15:04   #1
Dizistar
 
Аватар для Dizistar
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию Сегмент байта (Паскаль)

Запутался я совсем
цель зделать две функции.
Одна функция делит байт на два сегмента и возвращает два значения
в пределах F (16ти)
Вторая функция возвращает изначальный байт из двух сегментов (F И F)
Вообще что-то по аналогии с переменными word где можно верхний и нижний байт отделить.

Очень смутно пытался сделать что-то типа

polbyte1 := (byteN shr 2) and $ff;
Я что-то не соображу если у нас сдвиг то побитовый то может его надо на 8 ставить? Или на 16?
Чего то ерунда какая то получается у меня, не могу сообразить.

Подскажите пожалуйста как отделить верхний и нижний сегмент байта?
Но так конечно чтобы байт можно было обратно востановить. :-)

Последний раз редактировалось Dizistar; 23.04.2010 в 15:10. Причина: убрал лишнюю строку кода
Dizistar вне форума Ответить с цитированием
Старый 23.04.2010, 17:22   #2
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

LoByte:=byteN and $0F - так получишь младшую половинку байта
HiByte:=byteN and $F0 - так получишь старшую половинку байта
Логически сложишь две половинки - получишь исходный байт...
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 23.04.2010, 19:02   #3
Dizistar
 
Аватар для Dizistar
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Grag Посмотреть сообщение
Логически сложишь две половинки - получишь исходный байт...
Логическое сложение как должно выглядеть?
ByteN := Byte1 or Byte2;
Dizistar вне форума Ответить с цитированием
Старый 23.04.2010, 19:15   #4
Dizistar
 
Аватар для Dizistar
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

В паскале не работает, вроде и ошибку не пишет но и результата 0 - убедись:

Код:
Var
byteN, by2,by : byte;
BEGIN
byteN := 240;

By:= byteN and $0F; { - так получишь младшую половинку байта}
Writeln(' ',by);
By2:=byteN and $F0; { - так получишь старшую половинку байта}
Writeln(' ',by2);

readln;

END.
Dizistar вне форума Ответить с цитированием
Старый 23.04.2010, 19:34   #5
UnderwooD
Пользователь
 
Регистрация: 25.03.2010
Сообщений: 15
По умолчанию

логическое сложение - это операция and.


по-моему делать надо так:

VAR
b,bL,bH : byte;

BEGIN
readln(b);
bL:=(b shl 4) shr 4; // младший полубайт
bH:=b and $FF; // старший полубайт
END.

Последний раз редактировалось UnderwooD; 23.04.2010 в 19:40.
UnderwooD вне форума Ответить с цитированием
Старый 23.04.2010, 19:35   #6
Филантроп
Форумчанин
 
Аватар для Филантроп
 
Регистрация: 12.04.2010
Сообщений: 134
По умолчанию

Цитата:
логическое сложение - это операция and.
Да ну, вы в этом точно уверены?

Цитата:
Логическое сложение - двуместная логическая операция, определяемая таблицей истинности:
-: 0 or 0 = 0
-: 0 or 1 = 1
-: 1 or 0 = 1
-: 1 or 1 = 1
Синонимы: Дизъюнкция
Синонимы английские: or
кому нужна помощь! жду в аське и скайпе!
Филантроп вне форума Ответить с цитированием
Старый 23.04.2010, 19:41   #7
UnderwooD
Пользователь
 
Регистрация: 25.03.2010
Сообщений: 15
По умолчанию

ой, точно!

попутал!
UnderwooD вне форума Ответить с цитированием
Старый 23.04.2010, 21:01   #8
Dizistar
 
Аватар для Dizistar
 
Регистрация: 23.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от UnderwooD Посмотреть сообщение
по-моему делать надо так:
Нет не подходит и младший и старший полубайт получается равен заданному байту.
То есть в обоих случаях выводит 240:
Код:
 Var
byteN, by2,by : byte;
BEGIN
byteN := 240;

by:=(byteN shl 4) shr 4; { младший полубайт}
by2:=byteN and $FF; { старший полубайт}

Writeln(':0F: ',by);
Writeln('F0: ',by2);

ByteN :=0;
ByteN := By or By2;

writeln(by,'  or  ', by2,'   = ',ByteN);
readln;

END.

Последний раз редактировалось Dizistar; 23.04.2010 в 21:09.
Dizistar вне форума Ответить с цитированием
Старый 24.04.2010, 22:52   #9
UnderwooD
Пользователь
 
Регистрация: 25.03.2010
Сообщений: 15
По умолчанию

Упс! Извиняюсь! Писал по памяти - насвинячил. Надо так:
by:=byteN shl 4;
by:=by shr 4; // младший полубайт
by2:=by shr 4; // старший полубайт

Все, теперь косяк точно исправлен!
UnderwooD вне форума Ответить с цитированием
Старый 24.04.2010, 22:54   #10
UnderwooD
Пользователь
 
Регистрация: 25.03.2010
Сообщений: 15
По умолчанию

А как свой код выделять, когда пишешь?

Я просто третий раз в жизни на форум зашел. =)
UnderwooD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенос сегмента кода за сегмент данных Федор777 Общие вопросы C/C++ 2 20.04.2010 18:43
Как вынести объявление переменных в отдельный сегмент кода boris-blade Microsoft Office Word 1 16.01.2010 19:31
Сегмент стека Santilos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 24.12.2008 18:47
взятие старшего и младшего байта Djaconda Общие вопросы Delphi 2 29.09.2008 09:25
Вывод байта в двоичном пердставлении (С++) trollik Помощь студентам 6 01.09.2008 23:55