Модератор: gaidar
Да, написание критических модулей на других языках.возможно ли заменить ее другими операциями?
ANDLL писал(а):2Nicky:Вероятно нелишним будет объянить к чему была приведенная формула?
Antonariy писал(а):...в связи с чем вопрос: возможно ли заменить ее другими операциями?...
Option Explicit
Sub Main()
Dim a As Long, b As Long, c As Long
'если убрать строки, компилятор сразу подставит в c готовый результат ;-)
a = "&H5A5A"
b = "&HA5A5"
c = a Xor b
MsgBox c
End Sub
6: a = "&H5A5A"
0040161C mov edi,dword ptr [__imp_@__vbaI4Str (00401050)]
00401622 xor esi,esi
00401624 push offset ___vba@001BE140 (0040131c)
00401629 mov dword ptr [c],esi
0040162C mov dword ptr [unnamed_var1],esi
0040162F mov dword ptr [unnamed_var1],esi
00401632 mov dword ptr [unnamed_var1],esi
00401635 mov dword ptr [unnamed_var1],esi
00401638 call edi
7: b = "&HA5A5"
0040163A push offset ___vba@001BE158 (00401330)
0040163F mov ebx,eax
00401641 call edi
8: c = a Xor b
00401643 xor eax,ebx
00401992: mov edi, MSVBVM60.DLL.__vbaVarCopy
00401998: xor esi, esi
0040199A: mov ebx, 00000008h
0040199F: mov var_78, esi
004019A2: lea edx, var_78
004019A5: lea ecx, var_24
004019A8: mov var_24, esi
004019AB: mov var_34, esi
004019AE: mov var_38, esi
004019B1: mov var_48, esi
004019B4: mov var_58, esi
004019B7: mov var_68, esi
004019BA: mov var_70, 00401604h ; &H5A5A
004019C1: mov var_78, ebx
004019C4: call edi
004019C6: lea edx, var_78
004019C9: lea ecx, var_34
004019CC: mov var_70, 00401618h ; &HA5A5
004019D3: mov var_78, ebx
004019D6: call edi
004019D8: lea eax, var_24
004019DB: lea ecx, var_34
004019DE: push eax
004019DF: lea edx, var_48
004019E2: push ecx
004019E3: push edx
004019E4: call Xor
Currency And Currency
uhm писал(а):Кхм... а что должно получиться в результате операции Курренси энд Курренси?
uhm писал(а):Кхм... а что должно получиться в результате операции Курренси энд Курренси?
Dim s As Currency
s = 4294967295# And 3084996963#
!Viper! писал(а):А зачем интересно может понадобиться операция Currency And Currency в принципе?
MSDN писал(а):This structure is used to store a currency value.
typedef CY CURRENCY;
Remarks
A currency number is stored as an 8-byte, two's complement integer, scaled by 10,000 to give a fixed-point number with 15 digits to the left of the decimal point and 4 digits to the right. This representation provides a range of 922337203685477.5807 to -922337203685477.5808. The CURRENCY data type is useful for calculations involving money, or for any fixed-point calculation where accuracy is particularly important.
The CURRENCY data type is defined as the union of a structure containing two bytes and a 64-bit integer, using the following code:
typedef union FARSTRUCT tagCY {
struct {
#ifdef _MAC
long Hi;
unsigned long Lo;
#else
unsigned long Lo;
long Hi;
#endif
};
LONGLONG int64;
} CY;
tyomitch писал(а):Возможно, он просто хранит в Currency 64-битные числа. Тогда применять к ним AND вполне осмысленно.
По сути вопроса: я бы сделал LSet в UDT из двух Long-ов, в ней сделал And, и затем LSet обратно. Не самый быстрый способ, но с ассемблерными вставками вряд ли будет быстрее.
Public Type int64
lowD As Long
highD As Long
End Type
Public Type curUDT
num As Currency
End Type
Dim a As int64, b As curUDT
b.num = 49359951418# '&HB7E15163A
LSet a = b
Public Type curUDT
num As Double
End Type
?a.lowD
hex( 745799680 )
2C740000
?a.highD
?hex( 1109851178 )
4226FC2A
alibek писал(а):Верно, Currency это тип данных с фиксированной запятой, четыре знака справа от запятой. Раздели на 10000 и получишь нужное число.
Кстати, inline-объявление для Currency не #, а @.
Public Type MYCUR
lowL As Long
highL As Long
End Type
Public Function CurencyXor(cur_num As Currency) As Currency
Dim gg As MYCUR
LSet gg = cur_num
gg.highL = gg.highL Xor &HAAAAAAAA
gg.lowL = gg.lowL Xor &HAAAAAAAA
LSet cur_num = gg
CurencyXor = cur_num
End Function
LSet gg = cur_num
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Dim number2(7) As Byte
Public Sub InitXor()
Dim i As Integer
Randomize Timer
For i = 0 To 7
number2(i) = Int(Rnd * 255)
Next
End Sub
Public Function CurrencyXor(cur_num As Currency) As Currency
Dim number1(7) As Byte
Dim i As Integer
'Копируем значение в массив
CopyMemory number1(0), cur_num, 8
For i = 0 To 7
number1(i) = number1(i) Xor number2(i)
Next
'Копируем массив обратно в переменную
CopyMemory cur_num, number1(0), 8
'Возвращаем значение
CurrencyXor = cur_num
End Function
Вернуться в Раздел для Профессионалов
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8