Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wie fragt man Bits in einem Integer mit Delphi ab?


Ebil - Fr 27.06.08 01:21
Titel: Wie fragt man Bits in einem Integer mit Delphi ab?
Hi leute,
Sorry für den doofen thread titel, ich hab aber echt keine ahnung wie ich soetwas nennen könnte...

Es geht um ein Spiel bei dem einem monster verschiedene modi zugeteilt werden, ich versuche das ganze hier vereinfacht anders darzustellen, und hoffe ihr versteht mein problem!

wert 1: Peter hat Blaue Haare.
wert 2: Peter hat Grüne Augen.
wert 4: Peter hat Gelbe Haut.
wert 8: Peter hat ein Schwarzes Hemd an.
wert 16: Peter ist 18.

So, nehmen wir das als ausgangswerte, die liste kann man beliebig weiterführen wobei sich der wert immer verdoppelt.
Nun bekomme ich einen wert wie zb: 12.
Somit hat peter Gelbe Haut und ein Schwarzes Hemd an.
Bei dem wert 7 Hat Peter Blaue haare, Grüne Augen, und Gelbe Haut.
Also immer eine eindeutige zuweisung.

Aber wie kriege ich soetwas nun mit delphi raus?
Ich meine umso mehr einträge es werden, umso extrem-größer würde eine case of abfrage zb werden, ich will garnicht wissen wieviele möglichkeiten es schon bei meinem kleinen beispiel gibt, und bei meinen echten problem gibts da noch ein paar mehr möglichkeiten.
Und wie nennt man sowas eigentlich? Ist ja ziemlich nützlich wie ich finde.
Hoffe ihr habt mich verstanden, und dazu auch mein problem, und ich hoffe ich hab es halbwegs verständlich geäußert.

Gruß
Ebil

Moderiert von user profile iconNarses: Thread-Titel ergänzt ;)


Fabian E. - Fr 27.06.08 02:14

Du kannst das mit einer If-Abfrage prüfen.
Z.B. so:

Delphi-Quelltext
1:
2:
3:
4:
if (Value and 1) <> 0 then
//Peter hat blaue Haare
if (Value and 2) <> 0
//Peter hat grüne augen


Ebil - Fr 27.06.08 02:27

Mh ich verstehs nich ganz, entweder hast du mein problem nicht verstanden, oder ich hab deine lösung für mein problem nicht verstanden.

Mein problem ist das ich zb aus der zahl 12 die jeweiligen werte (Gelbe Haut und ein Schwarzes Hemd) ermitteln muss.


Fabian E. - Fr 27.06.08 02:31

Ja, du schreibst für Eigenschaft eine Abfrage. Dort ersetzt du 1 bzw 2 durch die jeweilige Zahl. Dann hast du so viele Abfragen wie du Eigenschaften hast.


Tilman - Fr 27.06.08 02:43

user profile iconEbil hat folgendes geschrieben:
Mh ich verstehs nich ganz, entweder hast du mein problem nicht verstanden, oder ich hab deine lösung für mein problem nicht verstanden.

Mein problem ist das ich zb aus der zahl 12 die jeweiligen werte (Gelbe Haut und ein Schwarzes Hemd) ermitteln muss.


Vielleicht hat es was mit dem Bier der deutschen Nationalmannschaft [http://www.bitburger.de/] zu tun?


Ebil - Fr 27.06.08 03:06

Mh stimmt... hätte nicht gedacht das es so einfach geht, funkt aber! Danke.
Man nun weiss ich nich ob ich Info studieren soll oda nich, wenn ich nichma sowas gebacken krieg, und nein, ich hab nix gesoffen :/

Ebil

//Edit: ok wenn ich so auf die uhr gucken, vllt liegt es daran :D


Hidden - Fr 27.06.08 07:48

Vielleicht hätte jemand erwähnen sollen, dass das and hier ein bitweises und ist. Da du mit einer Zahl 'verundelst', in der nur ein Bit gesetzt ist, verundelst du praktisch mit dem Bit.

In deiner Lösung ist nun das Bit nur dann gesetzt, wenn es vorher gesetzt war. Alle anderen Bits sind auf jeden Fall nicht gesetzt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  10101101 and
  00001000
00001000


  10100101 and
  00001000
00000000

Somit kommt 0 raus, wenn das Bit nicht gesetzt war, ansonsten eine Zahl, in der nur das Bit gesetzt ist. Diese ist ungleich null, was nebenbei bemerkt die Definition von Suche in der Entwickler-Ecke TRUE ist. Mit '<>0' wandelst du also praktisch dein Ergebnis in einen Boolean. if Boolean(Paul and 2then ...

'Paul and 7' würde übrigens zurückgeben, ob irgendeines der Bits 1, 2 oder 4(4 + 2 + 1 = 7) gesetzt ist.

Die Boolean-Casts hab ich mal weggelassen:
1:
(Paul and 7) <=> ((Paul and 1or (Paul and 2or (Paul and 4))                    


Edit: Überflüssige nullen entfernt

mfG,


alzaimar - Fr 27.06.08 08:14

Hidden, eine schöne Erklärung.
user profile iconHidden hat folgendes geschrieben:

imho geht also auch:
1:
if Boolean(Paul and 2then ...                    
Chleudert ten Purchen chu Poden!

Hidden: :mahn: Teeren und Federn sollte man dich für diesen 'Tipp' bei einer Anfängerfrage. :zwinker:


Ebil - Fr 27.06.08 13:13

Genau das wollte ich noch nachfragen :P
Als ich das hier gesehn hab hab ich erstmal nachgeschaut was der "and" operator da zu suchen hat, dann hab ich vom "bitweisen and" gehört, aber nichts verstanden...
Deine erklärung ist da ziemlich einleuchtent, danke für die mühe!


Tilman - Fr 27.06.08 18:11

user profile iconEbil hat folgendes geschrieben:
Genau das wollte ich noch nachfragen :P
Als ich das hier gesehn hab hab ich erstmal nachgeschaut was der "and" operator da zu suchen hat, dann hab ich vom "bitweisen and" gehört, aber nichts verstanden...
Deine erklärung ist da ziemlich einleuchtent, danke für die mühe!


ich wollte deir eh net unterstellen das du besoffen bist ^^ mein Hinweis-Link war scherzhaft, aber durchaus erst gemeint :lol:


Hidden - Fr 27.06.08 18:15

Hmm.. Den Zusammenhang zwischen seinem letzten Post und dem Bier hab ich immer noch nicht verstanden. Ein Wortspiel?

user profile iconTilman hat folgendes geschrieben:
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
Meinen Reis bekommst du nicht!


wazup - Fr 27.06.08 18:51


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function IntegerToHaare(Wert: Integer): string;
begin
  Result := '';
  
  if Wert in [0..32then
  begin
    if 1 and Wert <> 0 then Result := Result + 'rot';  // Xd
    if 2 and Wert <> 0 then Result := Result + 'grün'// xD
    if 4 and Wert <> 0 then Result := Result + 'blau'// Xd
    if 8 and Wert <> 0 then Result := Result + 'schwarz';
    if 16 and Wert <> 0 then Result := Result + 'braun';
  end;
end;


Narses - Fr 27.06.08 19:00

Moin!

Alternative (leichter erweiterbar): ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function IntegerToHaare(const Wert: Integer): String;
  const
    Max = 5// Max (also MaxMax) ist hier natürlich 32 ;)
    Haarfarbe: array[1..Max] of String =
      ( 'rot','grün','blau','schwarz','braun' );
  var
    i,Bit: Integer;
begin
  Result := '';
  Bit := 1;
  for i := 1 to Max do begin
    if ( (Wert and Bit) <> 0then
      Result := Result +Haarfarbe[i]+',';
    Bit := Bit shl 1;
  end;
end;



@user profile iconwazup: Du hast einen Fehler im Code: ;)
user profile iconwazup hat folgendes geschrieben:

Delphi-Quelltext
1:
if Wert in [0..31then                    
cu
Narses


wazup - Fr 27.06.08 19:03

Ouh... kommt auch mal vor ^^ :oops:


Hidden - Fr 27.06.08 19:03

Statt shl kannst du auch "* 2" nehmen, im Binärsystem. Bedeutet "Leftshift".

Hoffe mal ich hab nichts falsches erzählt ;)

mfG,