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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2007, 15:22   #1
Onix84
Новичок
Джуниор
 
Регистрация: 16.11.2007
Сообщений: 1
Стрелка Delphi и int64

Друзья!

Подскажите пожалуйста, как в Delphi правильно работать с 64-битными int64.

Вот например мне нужно обменять местами старшие и младшие 32 бита.
Пробовал
x:=(y shl 32) or (y shr 32)
не работает

Даже не хочет выделять 32 бита из 64 (например x:=y shl 32);

Помогите пожалуйста!
Или может быть хотя бы ссылку на статью существующую подскажите.
(надеюсь, я в правильной ветке форума задал вопрос)
Onix84 вне форума Ответить с цитированием
Старый 18.11.2007, 23:28   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Зависит от разных причин, например, от требований по скорости. Если скорость критична - нужно делать на ассемблере. Если не очень - то можно использовать тип записей с вариантной частью. Так, кстати, можно работать не только с 32-битными полями, но и с 16- и 8-битными.
Вот кусок кода, где показаны обмены разных полей.
Код:
var
  V: packed record
    case X: Integer of
    0: (V64: Int64);
    1: (I1, I2: LongWord);
    2: (W1, W2, W3, W4: Word);
    3: (B1, B2, B3, B4, B5, B6, B7, B8: Byte); // Варианты 3 и 4
    4: (B: packed array[1..8] of Byte);        // равнозначны
  end;

  TempI: LongWord;
  TempW: Word;
begin
  // Начальное значение
  V.V64 := 1234567890987654321;
  Application.MessageBox(PAnsiChar('V=' + IntToStr(V.V64)), '');

  // Обмен местами старших и младших 32-битных полей
  TempI := V.I1;
  V.I1 := V.I2;
  V.I2 := TempI;
  Application.MessageBox(PAnsiChar('V=' + IntToStr(V.V64)), '');

  // Обмен местами старших и младших 16-битных полей
  TempW := V.W1;
  V.W1 := V.W4;
  V.W4 := TempW;
  Application.MessageBox(PAnsiChar('V=' + IntToStr(V.V64)), '');
end;
Слово "packed" для таких записей нужно писать обязательно, иначе всё очень сильно будет зависеть от варианта выравнивания данных. А так гарантируется, что все поля (I..., W... и B...) будут одной "физической длины" - 64 бит.
Jeni вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа-тест в Delphi) скиньте))а то програмку здавать преподу надо,и самой хочется понять Delphi Верчик Помощь студентам 9 02.03.2009 17:46
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54