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

Если исходное число является, к примеру, шестнадцатиричным текстом - тогда все проще
...
Рейтинг: 0 / 0
10.08.2011, 18:54
    #37389921
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
smntконечно в переменной... в переменную оно как попадает?
...
Рейтинг: 0 / 0
10.08.2011, 19:08
    #37389930
smnt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
В переменную оно попадает из контроллера (ПЛК).
А что делать, если в 8 или 16 разряде может быть 1?
...
Рейтинг: 0 / 0
10.08.2011, 19:10
    #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
11.08.2011, 00:00
    #37390159
ZVI
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
11.08.2011, 00:10
    #37390169
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
Shocker.Proтакая штука работает в VB, но в VBS не прокатывает - не понимает Val конструкции &H В VBS нет функции Val(). Есть Eval(). Она конструкцию &H понимает.
...
Рейтинг: 0 / 0
11.08.2011, 00:17
    #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
11.08.2011, 00:23
    #37390177
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
Shocker.Pro,
авторИтак, тогда задача решается в одну строку:
...А если подумать ?
...
Рейтинг: 0 / 0
11.08.2011, 00:26
    #37390179
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
Shocker.ProИтак, тогда задача решается в одну строку:
Код: plaintext
EVal(Right(Hex(i),  4 ) & Left(Hex(i),  4 ))

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

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

?VarType(&H8000)=vbLong
False

?Hex(&H8000)
8000

Но:

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

Что касается скорости - думаю, что мой вариант быстрее твоего, но замерять щас лень
...
Рейтинг: 0 / 0
11.08.2011, 01:29
    #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
11.08.2011, 01:29
    #37390210
ZVI
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
11.08.2011, 01:34
    #37390213
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
Скукотища, спасибо - порадовал и результатом получше и кодом на VBS
Что-то мы вдвоем на одного ... :-)
...
Рейтинг: 0 / 0
11.08.2011, 01:36
    #37390215
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
ZVIЧто-то мы вдвоем на одного ... :-) ничего, так мне и надо :)
...
Рейтинг: 0 / 0
11.08.2011, 09:44
    #37390437
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поменять местами слова в двойном слове?
может мне и изменяет памфть, но поменять местами это практически как сдвинуть на определенное кол-во бит
а это простейшие операции умножения и деления

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

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

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

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


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