Zitat von
stoxx:
also eigentlich will ich ja mathematisch ausgedrückt, 3 Merkmalsvektoren, die einen Zustand von 1 bis 8 annehmen können, in einer 4 Byte großen Integerzahl speichern.
Vielleicht gibt es ja sogar noch bessere Lösungen, als das über Mengen zu gestalten ?
Du könntest die Vektoren direkt in einen Integer speichern, ob das aber geschickter ist, weiß ich nicht.
Da 8 Zustände 3 Bit entsprechen, würden in einen Longint bis zu 10 Vektoren passen.
Beispiel:
Delphi-Quellcode:
type
TState = 0..7;
TVectorIndex = 0..2
procedure SetState(const AState: TState; const AVectorIndex: TVectorIndex; var AValue: Integer);
begin
AValue := (AValue and not (7 shl (AVectorIndex * 3)) // alten Wert löschen
or (AState shl (AVectorIndex * 3)); // neuen einfügen
end;
Hab leider keine Zeit mehr, um zu überprüfen, ob die Prozedur nicht vollkommen falsch ist ^^ .
[edit]Doch noch etwas Zeit, es stimmt wohl soweit:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TState = 0..7;
TVectorIndex = 0..2;
procedure SetState(const AState: TState; const AVectorIndex: TVectorIndex; var AValue: Integer);
begin
AValue := (AValue and not (7 shl (AVectorIndex * 3))) // alten Wert löschen
or (AState shl (AVectorIndex * 3)); // neuen einfügen
end;
var
Value, i: Integer;
begin
Value := 1; // 1. Vektor = 1, 2.= 0, 3. = 0
SetState(6, 1, Value);
// 1.= 2, 2.= 6, 3.= 0
// einzelne Bits ausgeben
for i := 31 downto 0 do
if Value and (1 shl i) <> 0 then
Write('1')
else
Write('0');
Readln;
// Ausgabe: 00000000000000000000000000110001
// cccbbbaaa
// aaa = 1. Vektor = 001 = 1
// bbb = 2. Vektor = 110 = 6
end.