Entwickler-Ecke

Sonstiges (Delphi) - Wie teste ich, welche Bits in einem Int64 gesetzt sind?


dirkil2 - Mo 21.01.08 18:13
Titel: Wie teste ich, welche Bits in einem Int64 gesetzt sind?
Ich benötige eine Funktion, die testet, ob ein Bit in einem Int64 gesetzt ist. Ich probierte


Delphi-Quelltext
1:
2:
3:
4:
function isBitSet( const num: Int64; const i: Integer ) : Boolean;
begin
  Result := (num and (1 shl i)) <> 0;
end;


Das funktioniert aber nur für die ersten 32 Bits, da shl nur mit Integers (32 Bit) arbeitet. Wer hat eine Idee, wie ich das für Int64 abfragen kann?

Vielen Dank im Voraus!

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Allesquarks - Mo 21.01.08 18:29

Du könntest probieren ob du die int64 direkt shiften kannst und dann and verknüpfen.

Womit es auf jeden Fall geht ist rumpointern. Da musst du dann je nachdem welchen Teil des int64 du haben möchtest halt 4byte dazuaddieren.


benicz - Mo 21.01.08 18:32


Delphi-Quelltext
1:
2:
3:
4:
Function IsBit(AValue : LongWord; ABitNo : LongWord): boolean;  //blaa
Begin
  result:= ((AValue and ( 1 Shl (ABitNo-1)))>0);
End;


...nurnoch für int64 umbauen und gut.
das prinzip sollte sich erklären, oder?


viel erfolg!


edit:
sorry, nicht weit genug gelesen...
ich würd's in zweimal 32 bit unterteilen und dann trotzdem so machen


Lossy eX - Di 22.01.08 10:28

64 Bit Werte sind kein natives Format der CPU und Delphi versucht deinen Code so gut / schnell wie möglich zu gestalten. Also interpretiert er deine Konstante 1 als einen 32 Bit Integer. Was aus Sicht der Geschwindigkeit auch vollkommen okay ist. Aber dir ist es nicht möglich so die oberen 32 Bit anzusprechen. Jetzt musst du Delphi nur beibringen, dass er einen 64 Bit Wert benutzen soll.

Dazu genügt es den Wert 1 als Int64 zu casten oder alternativ kannst du auch eine typisierte Konstante / Variable verwenden.

Delphi-Quelltext
1:
  Result := (num and (Int64(1shl i)) <> 0;                    


BenBE - Di 29.01.08 02:40

alternativ:

Delphi-Quelltext
1:
Result := (num shr i) and 1 <> 0;