API функция для переворачивания Long числа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

API функция для переворачивания Long числа

Сообщение Teranas » 15.01.2017 (Вс) 6:12

Кто нибудь знает, как перевернуть Long число при помощи API функции, без копирования в байтовый массив?

У меня сейчас так, может, есть, что попроще
Код: Выделить всё
        nSwap = b2(x): b2(x) = b2(x + 3): b2(x + 3) = nSwap
        nSwap = b2(x + 1): b2(x + 1) = b2(x + 2): b2(x + 2) = nSwap
С уважением, Андрей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: API функция для переворачивания Long числа

Сообщение Хакер » 15.01.2017 (Вс) 7:33

Есть htonl и ntohl.

Но, во-первых они относятся к сетевой подсистеме ОС, хотя фактических препятствий к их использованию в несетевом применении нет.
Во-вторых, провозглашенная для них функциональность это не переворачивание байтов, а конвертация.

htonl это host-to-network (long).
ntohl это network-to-host (long).

Соответственно функции конвертируют между порядком байтов, используемым процессорпором целевой машины (host), и порядком, принятым в сетевых протоколах (network). В одном из частных случаев эта конвертация заключается в смене порядка байтов (если процессор целевой машины использует little endian организацию). В другом частном случае эта конвертация состоит в ничегониделаньи (если целевая машина использует big endian, так же, как сетевые протоколы).

Понятное дело, что VB пока что умеет делать исполняемые файлы под x86, который использует little endian, так что в отношении скомпилированного кода справедливо утверждение, что эти функции всегда меняют порядок байтов. Но все же идиологически верно использовать их только в отношении чисел, которые пришли из сети в формат, понятный целевому процессору, или наоборот. Или же не из сети, а из файла, формат которого придерживается той же принципиальной привязанности к big endian, как это делают сетевые протоколы. Например PNG.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: API функция для переворачивания Long числа

Сообщение Teranas » 15.01.2017 (Вс) 7:59

Спасибо Огромное!
Буду лепить, для тестовой проги пойдёт, там как раз скорость нужна.
С уважением, Андрей.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: API функция для переворачивания Long числа

Сообщение bon818 » 15.01.2017 (Вс) 10:50

http://www.xbeat.net/vbspeed/index.htm , раздел Bits
Не знаю, подойдет тебе это, но думаю будет полезно глянуть.
зы: в низу страниц, под ф-ми, тесты производительности.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: API функция для переворачивания Long числа

Сообщение Teranas » 15.01.2017 (Вс) 12:24

bon818
Код: Выделить всё
Public Function SwapEndian08(ByVal dw As Long) As Long
' by Mike D Sutton, Mike.Sutton@btclick.com, 20040914
  SwapEndian08 = _
      (((dw And &HFF000000) \ &H1000000) And &HFF&) Or _
      ((dw And &HFF0000) \ &H100&) Or _
      ((dw And &HFF00&) * &H100&) Or _
      ((dw And &H7F&) * &H1000000)
  If (dw And &H80&) Then SwapEndian08 = SwapEndian08 Or &H80000000
End Function

Забавно, с "And" и делением у них получается, по тестам, быстрее... :shock:
С уважением, Андрей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: API функция для переворачивания Long числа

Сообщение Хакер » 15.01.2017 (Вс) 13:02

Вообще, можно задачу выполнить ещё на порядок быстрее. Одной единственной инструкцией процессора — BSWAP. Все вышеперечисленные варианты она порвёт как тузик грелку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 30

    TopList