j0kky

Bitwise operations with 64 bit integers

1 post in this topic

Hi guys,

Bitwise operations in Autoit is possible only till 32 bit integers, but sometimes WinAPI requires to process 64 bit vectors... so?

So you can use this little UDF to handle properly those integers!

Func _BitAND64($iValue1, $iValue2)
    If Not ((VarGetType($iValue1) = "Int64") Or (VarGetType($iValue2) = "Int64")) Then Return BitAND($iValue1, $iValue2)
    $iValue1 = __DecToBin64($iValue1)
    $iValue2 = __DecToBin64($iValue2)
    Local $aValueANDed[64], $i
    For $i = 0 To 63
        $aValueANDed[$i] = ($iValue1[$i] And $iValue2[$i]) ? 1 : 0
    Next
    Return __BinToDec64($aValueANDed)
EndFunc   ;==>_BitAND64

Func _BitOR64($iValue1, $iValue2)
    If Not ((VarGetType($iValue1) = "Int64") Or (VarGetType($iValue2) = "Int64")) Then Return BitOR($iValue1, $iValue2)
    $iValue1 = __DecToBin64($iValue1)
    $iValue2 = __DecToBin64($iValue2)
    Local $aValueORed[64], $i
    For $i = 0 To 63
        $aValueORed[$i] = ($iValue1[$i] Or $iValue2[$i]) ? 1 : 0
    Next
    Return __BinToDec64($aValueORed)
EndFunc   ;==>_BitOR64

Func _BitXOR64($iValue1, $iValue2)
    If Not ((VarGetType($iValue1) = "Int64") Or (VarGetType($iValue2) = "Int64")) Then Return BitXOR($iValue1, $iValue2)
    $iValue1 = __DecToBin64($iValue1)
    $iValue2 = __DecToBin64($iValue2)
    Local $aValueXORed[64], $i
    For $i = 0 To 63
        $aValueXORed[$i] = (($iValue1[$i] And (Not $iValue2[$i])) Or ((Not $iValue1[$i]) And $iValue2)) ? 1 : 0
    Next
    Return __BinToDec64($aValueXORed)
EndFunc   ;==>_BitXOR64

Func _BitNOT64($iValue)
    If Not (VarGetType($iValue) = "Int64") Then Return BitNOT($iValue)
    $iValue = __DecToBin64($iValue)
    For $i = 0 To 63
        $iValue[$i] = Not $iValue[$i]
    Next
    Return __BinToDec64($iValue)
EndFunc   ;==>_BitNOT64

Func __DecToBin64($iDec)
    Local $tDec = DllStructCreate("int64 num"), $aBin[64], $bBit, $i
    $tDec.num = $iDec
    For $i = 0 To 63
        $bBit = (Mod($tDec.num, 2) ? 1 : 0)
        $aBin[63 - $i] = $bBit
        $tDec.num = Floor($tDec.num / 2)
    Next
    Return $aBin
EndFunc   ;==>__DecToBin64

Func __BinToDec64($aBin)
    Local $tDec = DllStructCreate("int64 num"), $i
    If $aBin[0] Then $tDec.num += 0x8000000000000000 ;2^63 = 9223372036854775808, but for Autoit the world ends at 9223372036854775807 (2^63 - 1)
    For $i = 1 To 63
        If $aBin[$i] Then $tDec.num += 2 ^ (63 - $i)
    Next
    Return $tDec.num
EndFunc   ;==>__BinToDec64

If you are working with unsigned 64 bit integers and these functions return a negative value, don't worry, bitwise operations come out well, but Autoit manages all numbers as signed integers.

1 person likes this

Share this post


Link to post
Share on other sites



Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • 232showtime
      bitAND magic numbers help
      By 232showtime
      good day,
      Please I need a little help ive been trying to find where I got this magic number and I remember it was for Minimize, but I really dont remember where I got this. Last thing I remember i was reading the help file and saw this minize magic numbers, but I cant find it anymore, I dnt wnt to use this magic number anymore OMG! please help...
      here it is.
      Local $hAaSf = "C:\Main.xlsx" ;Main excel Local $iStateAsf = WinGetState($hAaSf) BitAND($iStateAsf, 16)  
    • AutID
      _WinAPI_EnumProcessModules error 10
      By AutID
      Hello,

      I will put it as simple as possible
      Why this code runs perfectly on 32bit and it fails on 64bit?
      Local $hWND = WinGetProcess("[CLASS:LSS_app]") ConsoleWrite($hWND & @LF) Local $hModuleList = _WinAPI_EnumProcessModules($hWND) If @error Then ConsoleWrite("Error: " & @error & @LF) For $i = 0 To $hModuleList[0][0] - 1 ;~ If StringInStr($hModuleList[$i][1], "sysCap64.dll") Then ConsoleWrite($hModuleList[$i][0] & @LF) ;~ EndIf Next As the title says EnumProcessModules returns error 10 which I have no clue what it is.
      It must be something with autoit or my lack of coding because a similar code in C# will work like a charm on both x86 and x64
      Process[] Processes = Process.GetProcessesByName("winLSS64Cap"); Process nProcess = Processes[0]; Handle = OpenProcess(0x10, true, (uint)nProcess.Id); for(int i = 0; i < nProcess.Modules.Count; i++) { Console.WriteLine(nProcess.Modules[i].ModuleName); }  
    • andygo
      make script faster
      By andygo
      hello,
       
      i have a script which can handle huge data.
      i feed it with textfiles, it reads each line into array, then compare the lines, do some string operations. this all happens in a for.to.next loop.
       
      the script only use 15% cpu of my 8core.amd
       
      can i force the script to use more cpuload an therefore being faster?
       
      would it make a speed difference to compile it as 64bit exe on 64bit systems?
       
      thank you for commemts :)
    • Michiel
      HLKM64; it's documented but does it work?
      By Michiel
      As documented here, it is possible to bypass registry redirection when running a 32bit application on a 64bit Windows installation, using HKLM64 or HKCR64. I quote:
       
       
      In this thread, >this feature's existence is denied.

      Also, if this feature exists and works, does it work on both production and beta? And can I also specificy HKEY_LOCAL_MACHINE64 and HKEY_CLASSES_ROOT64 instead of HKLM64 and HKCR64?
    • drego
      64bit vs 32bit
      By drego
      During the AutoIt installer it gives the option to install 32bit or 64bit tools. Most systems these days are 64bit. Should I be creating autoit programs for both? Do autoit compiled applications really benefit from being 64 vs 32? If compiled for 64bit will there be a problem using the mass of UDFs available or does that not matter?
      Under what circumstances is compiling for 64bit going to make my program run better? Are there any downsides? Any differences in how I develop, use UDFs, DLLs, anything?
      Also, if I install 64bit Autoit tools can I still compile for 32bit and what about IE browser controls will they then be the 64bit IE?
      Thanks.