Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Два Byte в Word Не сложение!!!


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

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


Есть ли другие споссобы?

Автор: Snowy 19.6.2008, 12:33
Логическими операциями или вариантной записью.
Логическими логичнее smile
Код

  w := b1 shl 8 or b2;

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

Автор: Virtuals 19.6.2008, 13: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:28
.
а как удалять сообщения? smile 

Автор: Snowy 19.6.2008, 13:59
Цитата(Virtuals @  19.6.2008,  13:28 Найти цитируемый пост)
а как удалять сообщения?
Никак.
Только участники Клуба и выше имеют такую возможность.

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

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

Добавлено через 10 минут и 27 секунд
Сорь... я у себя проглядел и вместо or поставил and поэтому понятно почему глючило...

Автор: Snowy 19.6.2008, 14:26
Моя запись идентична твоей. Только работает быстрее и работает правильно.
Рассмотрим поотдельности.
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) и выведи результат на экран.

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

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

Код

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)