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
Narses: 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 if (Value and 2) <> 0 |
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
Ebil 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
TRUE ist. Mit '<>0' wandelst du also praktisch dein Ergebnis in einen Boolean.
if Boolean(Paul and 2) then ...
'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 1) or (Paul and 2) or (Paul and 4)) |
Edit: Überflüssige nullen entfernt
mfG,
alzaimar - Fr 27.06.08 08:14
Hidden, eine schöne Erklärung.
Hidden hat folgendes geschrieben: |
imho geht also auch: 1:
| if Boolean(Paul and 2) then ... | |
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
Ebil 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?
Tilman 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..32] then begin if 1 and Wert <> 0 then Result := Result + 'rot'; if 2 and Wert <> 0 then Result := Result + 'grün'; if 4 and Wert <> 0 then Result := Result + 'blau'; 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; 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) <> 0) then Result := Result +Haarfarbe[i]+','; Bit := Bit shl 1; end; end; |
@
wazup: Du hast einen Fehler im Code: ;)
wazup hat folgendes geschrieben: |
Delphi-Quelltext 1:
| if Wert in [0..31] then | |
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,
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!