Hallo,
ich bin gerade dabei ein Script zu schreiben, was mir dabei hilft einen Xbox Controller zu konfigurieren und Funktionen zuzuweisen.
Wenn ich die Buttons abrufe, die (auch gleichzeitig) gedrückt werden, bekomme ich Zahlen zurück die so aussehen: 1, 2, 4, 8, 16, 32, etc.
Wenn ich dann 2 Buttons gleichzeitig drücke bekomme ich z. B. eine 9 (ergibt sich aus 1 und 8), so ähnlich wie bei den Flags von MsgBox, welche man kombinieren kann.
Nun muss ich ausrechnen, dass sich in der 9 nur die 1 und 8 befinden kann, wie mache ich das?
Danke schonmal
Kombinationen von 1, 2, 4, 8, 16, etc. zurückrechnen
-
mchope57 -
8. August 2015 um 09:29 -
Erledigt
-
-
das sind zweierpotenzen. Diese in einer Schleife durchgehen und mit bitand einzeln vergleichen.
-
das sind zweierpotenzen. Diese in einer Schleife durchgehen und mit bitand einzeln vergleichen.
Kannst du mir ein kleines Beispiel geben? Ich weiß nicht wie ich das mit BitAND anstellen soll.
-
Jedes dieser Zahlen entspricht einem Bit in einer Binärzahl.
Man muss also abfragen ob an der jeweiligen Stelle das Bit gesetzt ist oder nicht.
Auf diese Weise kann man verschiedene Informationen in einer einzigen Zahl kombinieren und diese dann leicht wieder trennen.Für dein Beispiel:
-
Danke, damit werd ichs wohl hinkriegen wenn ich noch ein bisschen rumprobier.
-
- Offizieller Beitrag
Hier mal aus meiner Bsp-Kiste, umgesetzt mit Checkboxen:
AutoIt
Alles anzeigen; Muster Checkbox-Bearbeitung ; Ziel: einfache Abfrage, welche CB aktiviert sind #include <GUIConstants.au3> Opt('GUIOnEventMode', 1) Opt("MustDeclareVars", 1) Global $bCheckAll, $bUnCheckAll, $GUI, $i, $str Global $arCB[20][2] ; Array für Handle und Dual-Wert der CB For $i = 0 To UBound($arCB) -1 $arCB[$i][1] = 2^$i ; Zuweisung eindeutiger Wert Next Global $Checked = 0 ; Variable nimmt Status ALLER Checkboxen in einem Wert auf, ; Startstatus für alle: UNCHECKED Global $w = 500, $h = 20*30+40, $l = (@DesktopWidth-$w)/2, $t = (@DesktopHeight-$h)/2 Global $top = -10 $GUI = GUICreate('Test Checkbox', $w, $h, $l, $t) GUISetOnEvent($GUI_EVENT_CLOSE, '_Ende') For $i = 0 To UBound($arCB) -1 $top += 30 $arCB[$i][0] = GUICtrlCreateCheckbox('CheckBox_' & $i+1, 40, $top, 120) GUICtrlSetOnEvent(-1, '_ClickCB') Next $bCheckAll = GUICtrlCreateButton('Alle markieren', 250, 20, 150, 21) GUICtrlSetOnEvent(-1, '_CheckAll') $bUnCheckAll = GUICtrlCreateButton('Markierung aufheben', 250, 50, 150, 21) GUICtrlSetOnEvent(-1, '_UnCheckAll') GUISetState() While 1 Sleep(100) WEnd Func _Ende() Exit EndFunc Func _ClickCB() For $i = 0 To UBound($arCB) -1 If $arCB[$i][0] = @GUI_CtrlId Then $Checked = BitXOR($Checked, $arCB[$i][1]) _ReadCB() ExitLoop EndIf Next EndFunc Func _CheckAll() For $i = 0 To UBound($arCB) -1 If Not BitAND($Checked, $arCB[$i][1]) Then ;~ GUICtrlSetState($arCB[$i][0], $GUI_CHECKED) GUICtrlSetState($arCB[$i][0], BitOR($GUI_CHECKED, $GUI_DISABLE)) ; markieren und disablen $Checked = BitXOR($Checked, $arCB[$i][1]) EndIf Next _ReadCB() EndFunc Func _UnCheckAll() For $i = 0 To UBound($arCB) -1 If BitAND($Checked, $arCB[$i][1]) Then ;~ GUICtrlSetState($arCB[$i][0], $GUI_UNCHECKED) GUICtrlSetState($arCB[$i][0], BitOR($GUI_UNCHECKED, $GUI_ENABLE)) ; Markierung aufheben und enablen $Checked = BitXOR($Checked, $arCB[$i][1]) EndIf Next _ReadCB() EndFunc Func _ReadCB() ; Fkt. dient nur zur Ausgabe, welche CB markiert sind Local $str = 'Markiert: ' For $i = 0 To UBound($arCB) -1 If BitAND($Checked, $arCB[$i][1]) Then $str &= $i+1 & ', ' Next WinSetTitle($GUI, '', StringTrimRight($str, 2)) EndFunc