Autor Beitrag
dirkil2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Mo 21.01.08 18:13 
Ich benötige eine Funktion, die testet, ob ein Bit in einem Int64 gesetzt ist. Ich probierte

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP
Turbo Delphi 2006
BeitragVerfasst: Mo 21.01.08 18:32 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
  Result := (num and (Int64(1shl i)) <> 0;					

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 29.01.08 02:40 
alternativ:
ausblenden Delphi-Quelltext
1:
Result := (num shr i) and 1 <> 0;					

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.