Hallo Medium,
vielen Dank für Deine Antwort. Ich habe einen Athlon(Venice). Ein wenig habe ich mich auch schon mit dem MMX Befehlssatz beschäftigt. Ich habe nicht gesagt das QWORD buggy ist, sondern uInt64 in Delphi 2005.
Suche mal hier
hier nach uInt64
Wenn ich dies in Delphi 2005 ausführe, erhalte ich als Ergebnis -1, in Free Pascal 18446744073709551615
(In Free Pascal ersetze ich uInt64 durch QWORD)
Delphi-Quellcode:
Var test_uint64: uInt64;
test_uint64: = 18446744073709551615; {alle 64 bit auf 1 gesetzt}
ShowMessage(intToStr(test_uint64: ))
Zu 2)
Habe mir schon gedacht, daß es da keinen speziellen Befehl gibt. SCHADE
Hintergrund meiner Frage: Ich dachte da an folgenden Algorithmus:
Ein QWORD für die weissen Steine (wQW), eines für die schwarzen (sQW) und für die leeren Felder -> leerQW:= neg(sQW or wQW)
Interne Darstellung des Spielbrettes Feld A1 = 1 und H8 = 8000000000000000 Hex
Jetzt der Zuggenerator aus der Sicht von Weiss:
1) Zuerst suche ich alle Zugmöglichkeiten von links nach Rechts. Ich entferne (maskiere) alle nicht benötigten Steine von Schwarz die dafür uninteressant sind (A1 bis A8 und H1 bis H8 )
2) Dann schiebe ich das Brett mit den schwarzen Steinen um eine Position nach rechts und mache ein AND mit leerQW. Dadurch habe ich alle leeren Felder gefunden bei denen direkt rechts daneben ein schwarzer Stein ist.
3) Jetzt tue ich so, als ob der abschl. weisse Stein kommt. Hier interessieren mich folgende weisse Steine nicht, von (A1 bis A8 und B1 bis B8 maskieren). Schiebe 2 nach rechts und mach ein AND mit leerQW, was ich in ein neues QWORD rette. In diesem QWORD stehen jetzt alle Zugmöglichkeiten von links nach rechts, wo nur ein schwarzer Stein umgedreht wird.
4) Entferne jetzt diese Treffer aus der Menge zu Punkt 2) => Ergenis aus 2) AND NEG (neues QWORD aus 4) )
usw.
Als Ergebnis habe ich 8 (Richtungen) * 6 (1 bis 6 umgedrehte schwarze Steine) = 48 QWORDS
..und wenn ich jetzt auch noch in den 48 QWORDS suchen muss, dann verliere ich wieder alles, was vorher so schön geklappt hat
..und deswegen habe ich @grenzgaenger geschrieben, hier wird jedes Bit umgedreht. Damit meine ich meinen obigen Pseudocode, wo
ich alles auscodieren wollte!
Also:
Delphi-Quellcode:
if (wbBoard and A1) = Empty then
begin
..
end;
if (wbBoard and A2) = Empty then
begin
..
end;
..bis H8
..auch Danke für Deine Hilfe @jfheins. Sehr trickreich
Ich vermute aber wie Du das es nicht besonders performant ist.
Mal sehen ob mir noch was geschicktes einfällt