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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> последовательность байт в обратном порядке, int64 
:(
    Опции темы
Bose
Дата 12.12.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Для int64 надо получить 8 байт расположенных наоборот... т.е. 1й байт меняется местами с 8м, 2й с 7мым, 3й с 6м, 4й с 5м.

как?
PM MAIL WWW Skype   Вверх
darkart
Дата 12.12.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 31



Может эта функция подойдет:
Код

function ReverseInt64(x:int64):int64;
const
  byt=256;
var
  i:integer;
  tmp:int64;
begin
  tmp:=0;
  for i:=1 to 8 do
  begin
    tmp:=tmp*byt+x mod byt;
    x:=x div byt;
  end;
  Result:=tmp;
end;

Пример прилагается.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Int64Rev.zip 7,24 Kb
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 12.12.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чуть более быстрый вариант:
Код

function Revert(i64: Int64):int64;
var
  i:   byte;
  s,d: ^byte;
begin
  result:=0;
  s:=@i64; d:=@result; inc(d,7);
  for i:=0 to 7 do
  begin
    move(s^, d^, 1);
    inc(s); dec(d);
  end;
end;

На асме можно быстрее придумать, но что-то голова сегодня не очень соображает.
PM MAIL   Вверх
nworm
Дата 12.12.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 8



Забавно, сейчас потестировал вариант darkart.

Код

c:=ReverseInt64(11111111);
n:=ReverseInt64(c);


получил n=-5731640

Вопрос: зачем это делать? В help-е сказано, что int64 - знаковый. В общем, чего-то я не понял smile
PM MAIL WWW   Вверх
Демо
Дата 12.12.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Тык не быстрее? ;)

Код

function RevInt64(const Src: Int64): Int64;
begin
    Result :=
        ((Src and $ff00000000000000) shr 56) or
        ((Src and $00ff000000000000) shr 40) or
        ((Src and $0000ff0000000000) shr 24) or
        ((Src and $000000ff00000000) shr 8) or
        ((Src and $00000000ff000000) shl 8) or
        ((Src and $0000000000ff0000) shl 24) or
        ((Src and $000000000000ff00) shl 40) or
        ((Src and $00000000000000ff) shl 56);
end;




--------------------
    
PM MAIL ICQ Skype   Вверх
Bose
Дата 13.12.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Ух, сколько вариантов! smile А я вчера часа четыре голову ломал над тем как это сделать smile. C указателями у меня вообще ничего не вышло... Дельфи не давал прибавить 1 к указателю smile
Код

var    
 p: ^byte;    
begin    
 p:=p+1; // здесь компилятор начинал ругаться
end;


А оказывается, нужно было сделать вот так: inc(p); smile

Вариант darkartа мне вообще в голову не пришёл... А вот вариант, аналогичный предложенному Демо пришёл, но я пытался его реализовать через цикл и запутался окончательно, со всеми этими сдвигами. =)

Всем большое спасибо!

PM MAIL WWW Skype   Вверх
Демо
Дата 14.12.2005, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Можно сделать красиво, а можно быстро. Смотря что нужно;)



--------------------
    
PM MAIL 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.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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