Bit aus 0xZahl abfragen

  • Hallo Zusammen,

    ich möchte aus eine Zahl - die bis 32 Byte (nicht Bit) Groß sein kann - ein Bit X zeigen, ob Bit 0 oder 1 ist.

    Angefangen bin ich mit Erklärung von BugFix: Bit Operationen
    Ich habe auch noch ein paar Beispiele gefunden, aber richtig weiter komme ich nicht.


    Bitte um die Unterstützung mit Ideen.

    Mit der Darstellung komme ich nur weiter, wenn ich Byteweise anschaue, sonst wird die Zahl wahrscheinlich überlaufen und ich bekomme komische Zahlen, die ich nicht erwarte.

    Hier ist maximum dargestellt:

    Code
    $hVar = "0x" & "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    
    Local $dBinary = Binary($hVar) ; Convert the string to binary.
    MsgBox($MB_SYSTEMMODAL, $hVar, "Returns 1 as the variable is binary: " & IsBinary($dBinary))
    
    Local $dExtract = BinaryMid($hVar, 32)
    MsgBox($MB_SYSTEMMODAL, "", "The bytes are: " & $dExtract)

    Danke und Gruß

    Einmal editiert, zuletzt von tubsids (25. November 2017 um 10:47)

  • Mit Binary wirst du nicht weiterkommen.

    Das richtige Tutorial hast du ja schon gefunden.
    Musst es im Grunde nur noch anwenden - dann könntest du auf z.B. sowas kommen:

    AutoIt
    $sVar = "FF0F"
    $dNumber = Dec($sVar)
    ConsoleWrite($dNumber & @CRLF)
    
    ; Schrittweise alle Bits abfragen:
    For $i = 0 To 31
        ConsoleWrite("Bit " & $i+1 & ": " & (BitAND($dNumber, 2^$i) <> 0) & @CRLF)
    Next

    Im Grunde musst du nur die Zahl aus der du ein bestimmtes Bit haben willst mit einer anderen Zahl bitweise Und-verknüpfen wo ausschließlich dieses gewünschte Bit gesetzt ist.

    Das Ergebnis ist nur dann 1 wenn in der Ausgangszahl dieses Bit auf 1 gesetzt ist.

  • Schau dir das hier mal an :)

    MfG Kanashius

  • Kanashius:

    Zu deiner Funktion _getBit():

    • Der Parameter $max wird nicht verwendet und kann daher weg
    • Das erste Bit ist in dieser Funktion $bitcount = 0 (wie du ja auch in der Funktionsbeschreibung schreibst). Eventuell wäre es intuitiver bei 1 zu beginnen.
  • Mit Binary wirst du nicht weiterkommen.

    Das richtige Tutorial hast du ja schon gefunden.
    Musst es im Grunde nur noch anwenden - dann könntest du auf z.B. sowas kommen:

    AutoIt
    $sVar = "FF0F"
    $dNumber = Dec($sVar)
    ConsoleWrite($dNumber & @CRLF)
    
    ; Schrittweise alle Bits abfragen:
    For $i = 0 To 31
        ConsoleWrite("Bit " & $i+1 & ": " & (BitAND($dNumber, 2^$i) <> 0) & @CRLF)
    Next

    Im Grunde musst du nur die Zahl aus der du ein bestimmtes Bit haben willst mit einer anderen Zahl bitweise Und-verknüpfen wo ausschließlich dieses gewünschte Bit gesetzt ist.

    Das Ergebnis ist nur dann 1 wenn in der Ausgangszahl dieses Bit auf 1 gesetzt ist.

    Hallo AspirinJunkie,

    danke Dir für den Vorschlag.

    Mein Problem ist, die Zahl ist mehr als 32 Bit sein kann, also bis zu 255 bit (32 Byte) wenn ich mich nicht verrechent habe.

    Also, Maximum ist

    $sVar = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"

    kann aber weniger sein, und jeder FF ist ein Byte.

    Aber Danke Dir noch mal!

    VG

  • Dann musst du tatsächlich erst den entsprechenden Bereich per Binary-Funktionen herausschneiden, diesen als Integer behandeln und dort per BitAnd die entsprechenden Bits abfragen.

    Edit: Hier mal fix (also nicht ausgiebig getestet) umgesetzt:

    2 Mal editiert, zuletzt von AspirinJunkie (25. November 2017 um 12:03)

  • Also entweder habe ich einen grandiosen Knoten im Gehirn oder das Script-Sample rechnet falsch.

    Abgesehen davon, daß es armseelig ist, wenn Autoit dafür keine Funktion(Binäre Darstellung nicht Hex) zur Verfügung stellt,

    das konnte vor 30 Jahren beinahe jedes Basic schon von Hause aus.

    Aber wenn du folgende Zeile nimmst zur besseren Verständlichkeit

    $sVar = "0xFF000000000000000000000000000000000000000000000000000000BBFF0F0F"

    Dann müssten doch die Bits 255 254 253 und 252 eine 1 ergeben und die restlichen Bits 251 250 249 und 248 sollten

    eine 0 liefern.

    Was bei mir definitiv nicht der Fall ist.

  • Etwas verkürzt ist dein Problem dass aus 0x0F die Folge 1111000 wird?

    Wenn man es binär darstellt wäre es tatsächlich falschherum da Zahlendarstellungen von rechts ausgehend mit dem niedrigsten Stellenwert anfangen.

    Hier stellen wir jedoch keine Gesamtzahl dar sondern fragen einzelne Stellen ab.

    Gehen wir von den Bits innerhalb des Bytes aus gibt es kein rechts und links. Nur die jeweilige Stelle.

    Welchen Wert hat also 0x0F als Dezimalzahl geschrieben?: 15.
    Das heißt in Binärdarstellung würde man es folgendermaßen ermitteln: 2^0 + 2^1 +2^2 + 2^3 = 15.

    Ergo: die Bits 1-4 müssen auf 1 gesetzt sein, die restlichen 5-8 auf 0.

    Genau das gibt auch die Funktion entsprechend aus:

    Um also von einem Binary zu dessen Binärdarstellung zu kommen musst du byteweise durchgehen und die Bits des jeweiligen Bytes vom 8-1 abarbeiten. So dass die Abfrage nun von links nach rechts erfolgt.

  • Vor ein paar Monaten habe ich mir für die Statusabfrage eines Raspberry Pi 3 eine ähnliche Funktion getippert...