Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два Byte в Word Не сложение!!! 
V
    Опции темы
RinOSpro
Дата 19.6.2008, 11:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть скажем 2 байтовых переменных и переменная Word и нужно пометить один байт в старший разряд а другой в младший разряд. (не сложить!);
Я сделал это таким споссобом:
Код

var
  b1, b2 : byte;
  w : word;
begin
...
  b1 := $01;
  b1 := $47;
  w := (b1 *$FF) + b2;
...
end;


Есть ли другие споссобы?
  Вверх
Snowy
Дата 19.6.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Логическими операциями или вариантной записью.
Логическими логичнее smile
Код

  w := b1 shl 8 or b2;

PM MAIL   Вверх
Beltar
Дата 19.6.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Еще один извращенский вариант использовать указатели. smile Но это для справки, т. к. варианты Snowy короче. smile


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Virtuals
Дата 19.6.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



извращения с волшебной палочкой ABSOLUTE но возможностей куча. тоесть вообще никаких операций не нужно делать ни сдвигов ни умножения, а просто обьявить переменные в одних и тех же местах smile 
Код

var W:word;
    B:array[0..1] of Byte absolute w;


    begin
    W:=$0000;
    writeln(hexW(W));

b[0]:=10;
b[1]:=20;

    writeln(hexW(W));
    end.


Это сообщение отредактировал(а) Virtuals - 19.6.2008, 13:43
PM MAIL ICQ   Вверх
Virtuals
Дата 19.6.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



.
а как удалять сообщения? smile 

Это сообщение отредактировал(а) Virtuals - 19.6.2008, 13:35
PM MAIL ICQ   Вверх
Snowy
Дата 19.6.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Virtuals @  19.6.2008,  13:28 Найти цитируемый пост)
а как удалять сообщения?
Никак.
Только участники Клуба и выше имеют такую возможность.
PM MAIL   Вверх
RinOSpro
Дата 19.6.2008, 14:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Snowy  ты уверен что это точнее я так делал... но отказался в пользу умножения. тк. что то это глючило помоему хотя хз...

В общем спасибо! Щас выберу оптимальный вариант.

Добавлено через 10 минут и 27 секунд
Сорь... я у себя проглядел и вместо or поставил and поэтому понятно почему глючило...
  Вверх
Snowy
Дата 19.6.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Моя запись идентична твоей. Только работает быстрее и работает правильно.
Рассмотрим поотдельности.
w := (b1 *$FF) + b2;
b1 *$FF - тут у тебя ошибка. Умножать нужно на $100.
Суди сам. Допустим b1 = 1, тогда b1 * $FF = $FF, что есть $00FF, а не $0100
Разумеется, при таком сдвиге, наложение нижнего байта будет давать полную ересь.
b1 *$100 = сдвигу на 8 байт вверх. Точнее влево.
$XX00 + $YY - сложение здесь не требуется, ибо у исходного числа нижние байты пустые, а у прибавляемого нет верхних байтов.
Таким образом быстрее проще наложить нижние байты второго, вместо нижних первого.
А разница будет, т.к. в твоём коде 2 ошибки:
1. Не присвоено b2
2. Неверно выполнен сдвиг первого байта.
А для проверки правильности, выполни IntToHex(w, 2) и выведи результат на экран.
PM MAIL   Вверх
Alexeis
Дата 19.6.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Директиву absolute, не желательно использовать, так как это усложнит перенос на Delphi.NET. По крайней мере Codeger не рекомендует ее использовать.

Вообще, красивее будет так

Код

  w := (word(b1) shl 8) or b2;


Дело в том что чисто логически b1 shl 8 должен дать 0, потому что операнд 8ми битовый, но компилятор оптимизирует вычисления расширяя байтовые операнды до 32х битовых слов, потому это будет работать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.