Zitat von
himitsu:
Zitat von
Amateurprofi:
Delphi-Quellcode:
function SingleValueInSet(v:zahlen):integer;
begin
result:=0;
if (Word(v)>0) and (Word(v) and (Word(v)-1) = 0) then // dann ist nur ein Wert im Set
while not odd(word(v)) do begin
inc(result);
Word(v):=Word(v) shr 1;
end;
end;
Bei dieser Art der Typkonvertierung muß man nur aufpassen.
Also der neue Typ muß genaudo groß sein, wie das Set, sonst meckert der Compiler.
Set = 1 Byte > Byte
Set = 2 Byte > Word
Set = 4 Byte > LongWord
...
Hier stimmt das Word aber > 9 Werte / 8 Bit = 1,125 = 2 Byte
Deshalb schrieb ich ja "ist aber etwas tricky und nicht beliebig auf ähnliche Probleme übertragbar".
Aber deine Rechnung 9 Werte/ 8 Bit = 1.125 = 2 Byte stimmt so nicht ganz.
In diesem Fall sind es 10 Bits (0..9). Mir war aufgefallen, daß bei diesem Set of 1..9 die 1 nicht etwa Bit 0 belegt (wie ich erwartet hätte) sondern Bit 1.
Wie der Compiler wann wieviel Platz reserviert ist mir im Moment noch nicht ganz klar.
Zum Beispiel
type zahlen=Set of 8..16; braucht 2 Bytes
type zahlen=Set of 7..16; braucht 4 Bytes
type zahlen=Set of 15..16; braucht 2 Bytes
aber : type zahlen=Set of 254..255; braucht 1 Byte
Alles Delphi 2005. Mag sein; andere Versionen compilieren das anders.
Vielleicht kennt ja jemand die genauen "Spielregeln" und erklärt sie.