powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как поменять местами слова в двойном слове?
25 сообщений из 26, страница 1 из 2
Как поменять местами слова в двойном слове?
    #37389884
smnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача в следующем.
Есть число занимающее двойное слово (4 байта).
Нужно в нем старшее и младшее слово поменять местами.
Как это можно сделать на VBS?
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389898
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smntЕсть число
можно уточнить, ГДЕ оно есть? В переменной?
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389910
smnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
конечно в переменной...
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389916
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему, собственно, спрашиваю
Вот, собственно, код перестановки:
Код: plaintext
1.
2.
i = &H15C413F2
MsgBox Hex(i \ &H10000 + (i Mod &H10000) * &H10000)
Но он не будет корректно работать для чисел, где в 16-м или 8-м разряде единица, так как он используется для отрицательных чисел.

Если исходное число является, к примеру, шестнадцатиричным текстом - тогда все проще
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389921
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smntконечно в переменной... в переменную оно как попадает?
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389930
smnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В переменную оно попадает из контроллера (ПЛК).
А что делать, если в 8 или 16 разряде может быть 1?
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37389933
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм
Код: plaintext
1.
2.
3.
i = &HF5C4E3F2
s = Hex(i)
s = Right(s,  4 ) & Left(s,  4 )
MsgBox Val("&H" & s)
такая штука работает в VB, но в VBS не прокатывает - не понимает Val конструкции &H
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390159
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
i = &H8000
j = LongSwap(i)
msgbox "i=" & hex(i) & Chr( 10 ) & "j=" & hex(j) 

Function LongSwap(InVal)
  Dim Lo, Hi, x
  x = CLng(InVal)
  Lo = x And &HFFFF&
  If Lo > &H7FFF Then Lo = Lo - &H10000
  Hi = (x And &HFFFF0000) \ &H10000
  LongSwap = CLng((Lo * &H10000) Or (Hi And &HFFFF&))
End Function
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390169
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proтакая штука работает в VB, но в VBS не прокатывает - не понимает Val конструкции &H В VBS нет функции Val(). Есть Eval(). Она конструкцию &H понимает.
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390173
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаShocker.Proтакая штука работает в VB, но в VBS не прокатывает - не понимает Val конструкции &H В VBS нет функции Val(). Есть Eval(). Она конструкцию &H понимает. Спасибо, скукотища, я ждал подсказки

Итак, тогда задача решается в одну строку:
Код: plaintext
EVal(Right(Hex(i),  4 ) & Left(Hex(i),  4 ))
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390177
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
авторИтак, тогда задача решается в одну строку:
...А если подумать ?
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390179
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИтак, тогда задача решается в одну строку:
Код: plaintext
EVal(Right(Hex(i),  4 ) & Left(Hex(i),  4 ))

i = 10 :-)
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390181
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаShocker.Pro,
авторИтак, тогда задача решается в одну строку:
...А если подумать ?
ах, да, потерял
Код: plaintext
EVal("&H" & Right(Hex(i),  4 ) & Left(Hex(i),  4 ))
подловил, таки, отомстил
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390182
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI,

я совсем плох :)
ща сделаем
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390183
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVI,
+1
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390187
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
s = Right("0000000" & Hex(i), 8 )
i = EVal("&H" & Right(s,  4 ) & Left(s,  4 ))
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390194
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, ещё не все, Вам осталось побороть типы, например, для i = &H8000

?VarType(&H8000)=vbLong
False

?Hex(&H8000)
8000

Но:

?Hex(Clng(&H8000))
FFFF 8000
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390197
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIShocker.Pro, ещё не все, Вам осталось побороть типы, например, для i = &H8000
Хотя у ТС может и не Long там в 4-х байтах, а 2 Integer-а, тогда у Вас - правильнее, разве что работа со строками все же помедленее. Зато у ТС теперь есть выбор :-)
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390201
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну присвоение типа i=&H8000 мы используем только для теста, а автор получает полный лонг в переменную, я так думаю, так что наверное все хорошо будет.

Что касается скорости - думаю, что мой вариант быстрее твоего, но замерять щас лень
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390209
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
Что касается скорости - думаю, что мой вариант быстрее твоего, но замерять щас лень
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
option explicit
dim i,j,s,k,t

i=&HF5C4E3F2
t=timer()
for k= 1  to  100000 
s = right("0000000" & hex(i), 8 )
j = eval("&H" & right(s,  4 ) & left(s,  4 ))
next
wscript.Echo "Shocker.Pro: " & timer()-t


t=timer()
for k= 1  to  100000 
j=LongSwap(i)
next
wscript.Echo "ZVI: " & timer()-t


Function LongSwap(InVal)
  Dim Lo, Hi, x
  x = CLng(InVal)
  Lo = x And &HFFFF&
  If Lo > &H7FFF Then Lo = Lo - &H10000
  Hi = (x And &HFFFF0000) \ &H10000
  LongSwap = CLng((Lo * &H10000) Or (Hi And &HFFFF&))
End Function
Код: plaintext
1.
Shocker.Pro:  1 , 531006 
ZVI:  0 , 3909912 

...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390210
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу присвоение типа i=&H8000 мы используем только для теста, а автор получает полный лонг в переменную, я так думаю, так что наверное все хорошо будет.Да, согласен. Надеюсь, ТС учтёт, что в VBS все переменные типа Variant и поэтому преобразование типов лучше делать явно.

Что касается скорости - думаю, что мой вариант быстрее твоего, но замерять щас леньНу мне то не лень, на моем компе мой вариант быстрее в 2 раза:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub Time_Test()
  
  Const N& =  1000000 
  
  Dim i&, j&, t1!, t2!, k&, s$
  i = - 1 
  
  t1 = Timer
  For k =  1  To N
    s = Right("0000000" & Hex(i),  8 )
    j = Val("&H" & Right(s,  4 ) & Left(s,  4 ))
  Next
  t1 = Timer - t1
  
  t2 = Timer
  For k =  1  To N
    j = LongSwap(i)
  Next
  t2 = Timer - t2
  
  MsgBox Round(t1,  3 ) & vbLf & Round(t2,  3 ) & vbLf & Round(t1 / t2,  3 )
  ' t1 / t2 =2.105
  
End Sub
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390213
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скукотища, спасибо - порадовал и результатом получше и кодом на VBS
Что-то мы вдвоем на одного ... :-)
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390215
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIЧто-то мы вдвоем на одного ... :-) ничего, так мне и надо :)
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390437
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может мне и изменяет памфть, но поменять местами это практически как сдвинуть на определенное кол-во бит
а это простейшие операции умножения и деления

вот мой вариант
критикуйте :)

Код: plaintext
Hex((i *  65536  + i /  65536 ))

правда нужно предусмотреть вариант при переполнении
т.е при i = &H15C413F2 при умножении будет ошибка
надо будет отрезать старшую часть числа
...
Рейтинг: 0 / 0
Как поменять местами слова в двойном слове?
    #37390452
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot,

это-то вариант я предложил здесь 11100172
и он бы работал, если бы не тот факт, что 16-й разряд используется под знак числа - это вносит те искажения, которые и компенсирует код ZVI 11101005
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как поменять местами слова в двойном слове?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]