Bitweise Operationen in 64 Bit ausführen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von fufu.

    Bitweise Operationen in 64 Bit ausführen

    Hi!

    VB.NET-Quellcode

    1. Dim test As UInt64 = (&HFFFF << 47)
    2. Stop
    3. For i As Integer = 0 To 47
    4. Console.WriteLine(i.ToString & vbTab & (&HFFFF << (i)).ToString("X16"))
    5. Next
    6. Console.ReadKey()


    Der gezeigte Code liefert mir die folgende Ausgabe:

    Spoiler anzeigen

    Quellcode

    1. 0 000000000000FFFF
    2. 1 000000000001FFFE
    3. 2 000000000003FFFC
    4. 3 000000000007FFF8
    5. 4 00000000000FFFF0
    6. 5 00000000001FFFE0
    7. 6 00000000003FFFC0
    8. 7 00000000007FFF80
    9. 8 0000000000FFFF00
    10. 9 0000000001FFFE00
    11. 10 0000000003FFFC00
    12. 11 0000000007FFF800
    13. 12 000000000FFFF000
    14. 13 000000001FFFE000
    15. 14 000000003FFFC000
    16. 15 000000007FFF8000
    17. 16 00000000FFFF0000
    18. 17 00000000FFFE0000
    19. 18 00000000FFFC0000
    20. 19 00000000FFF80000
    21. 20 00000000FFF00000
    22. 21 00000000FFE00000
    23. 22 00000000FFC00000
    24. 23 00000000FF800000
    25. 24 00000000FF000000
    26. 25 00000000FE000000
    27. 26 00000000FC000000
    28. 27 00000000F8000000
    29. 28 00000000F0000000
    30. 29 00000000E0000000
    31. 30 00000000C0000000
    32. 31 0000000080000000
    33. 32 000000000000FFFF
    34. 33 000000000001FFFE
    35. 34 000000000003FFFC
    36. 35 000000000007FFF8
    37. 36 00000000000FFFF0
    38. 37 00000000001FFFE0
    39. 38 00000000003FFFC0
    40. 39 00000000007FFF80
    41. 40 0000000000FFFF00
    42. 41 0000000001FFFE00
    43. 42 0000000003FFFC00
    44. 43 0000000007FFF800
    45. 44 000000000FFFF000
    46. 45 000000001FFFE000
    47. 46 000000003FFFC000
    48. 47 000000007FFF8000


    Eindeutig zu erkennen: die Shift-Operation arbeitet nicht über das 4 Byte hinaus, sondern "bricht um". Ich möchte die Konstante 0xFFFF aber gerne auch bis auf das MSB hochschieben können. Wie kann ich das erzielen? Im Konfigurationsmanager habe ich von "Any CPU" auf "x64" umgestellt. Leider ohne Erfolg. Der Code läuft auf einem 64 Bit System, sollte aber auch auf 32 Bit Rechner laufen.

    VB.NET-Quellcode

    1. Dim bi1 As New BigInteger(&HFFFF)
    2. For i As Integer = 0 To 47
    3. Console.WriteLine(i.ToString & vbTab & (bi1 << (i)).ToString("X16"))
    4. Next
    5. Console.ReadKey()



    und so geht das auch

    VB.NET-Quellcode

    1. Dim test1 As Int64 = (CType(65535, Int64) << 47)
    2. Dim test2 As UInt64 = (CType(65535, UInt64) << 47)


    und das finde ich jetzt schon ein bisschen krass. Funkst aber.
    Das letzte ('L') bzw. die beiden letzten ('UL') Literale werden als Konvertierungsmerkmale anerkannt.

    VB.NET-Quellcode

    1. For i As Integer = 0 To 47
    2. Console.WriteLine(i.ToString & vbTab & (&HFFFFL << (i)).ToString("X16"))
    3. Next

    VB.NET-Quellcode

    1. For i As Integer = 0 To 47
    2. Console.WriteLine(i.ToString & vbTab & (&HFFFFUL << (i)).ToString("X16"))
    3. Next



    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()