Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Int64 shl


gerd8888 - So 28.08.16 11:15
Titel: Int64 shl
Hallo,

bei einer int64 variable kann man mit shl nicht ueber 32 gehen. Jetzt wende ich den Trick an mit dem casten.


Delphi-Quelltext
1:
2:
3:
4:
5:
var testzahl:int64;
begin
  Testzahl := testzahl OR (1 shl bitnr);  //geht nicht bei bitnr>32
  Testzahl := Int64(1shl bitnr;        //das geht
end;


hat dies eigentlich auswirkungen auf die geschwindigkeit, also auf den Prozessablauf.
Und jetzt habe ich ein Problem. Ich moechte abfragen, ob das z.B. bitnr=40 schon gesetzt ist.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Bittest (TestZahl : int64;Bitnr: byte):boolean;
var
  Bitmaske : int64;
begin
  {Bitmaske := 1 shl BitNr;
  result := TestZahl AND BitMaske <> 0;}

  result := testzahl AND (1 shl BitNr) <> 0;  //wie muesste ich diese zeile umaendern?
end;


wie kann ich also nach dem 40 bit von links fragen, ob es gesetzt wurde.

Gerd


gerd8888 - So 28.08.16 11:43

Ich glaube ich habe es selbst gefunden:


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


gerd8888 - So 28.08.16 12:26

Hier mal das gesamte. Man kann jetzt auf einem int64 Bits setzen und löschen, sowie ermitteln (hier auf dem Schachbrett)
Nur leider muss ich jedesmal eine Maske machen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const qu_x=8; qu_y=8;
var
  Form1: TForm1;

implementation

{$R *.dfm}



var //brett1: array of array of shortint; //2-Dimens. dynamisches Array
    wk,sk:int64;
    bitzahl:int64;
    bitzahlen:array[0..63of int64;
    exz:extended;

function Bittest (TestZahl : int64;Bitnr: byte):boolean;
var
  Bitmaske : int64;
begin
  Result := (testzahl and (Int64(1shl bitnr)) <> 0;
end;


procedure BitSet(var TestZahl : int64;Bitnr: byte);
var bitmaske:int64;
begin
  bitmaske := Int64(1shl bitnr;
  testzahl:= bitmaske or testzahl;
end;

procedure BitClear(var TestZahl : int64;Bitnr: byte);
var bitmaske:int64;
begin
  bitmaske:= Int64(1shl bitnr;
  testzahl:= bitmaske xor testzahl;
end;


(*------------------------------------------------------------*)
(*Ein Schachbrett mit Canvas direkt auf das Formular ausgeben *)
(*Einfache Grafikmethode ganz ohne bitmaps                    *)
(*------------------------------------------------------------*)
procedure schachbrett;
const a_x=60; a_y=30;
      max_laenge=220;
var feld_lx, feld_ly:Integer; //feld_lx und feld_ly Feldlänge
    z,x,y:byte;

    procedure m(f:shortint);
    begin
      form1.Canvas.TextOut(               //In das Feld die Figur schreiben
        (a_x+x*feld_lx)+(feld_lx div 2)-3,
        (a_y+y*feld_ly)+(feld_ly div 2)-5, inttostr(f));
    end;

begin
  form1.Canvas.Rectangle(a_x-25,a_y-25,a_x+max_laenge+25,a_y+max_laenge+25);
  feld_lx:=max_laenge div qu_x;  // Feldlänge x
  feld_ly:=max_laenge div qu_y;  // Feldlänge y
  for z:=1 to 64 do begin
    y:=((z-1div 8);
    x:=((z-1mod 8);
  {for y:=1 to 8 do begin
    for x:=1 to 8 do begin
   }


    if (x+y) mod 2=0 then form1.Canvas.Brush.Color:=rgb(180,180,180else
    form1.Canvas.Brush.Color:=rgb(120,120,120);   //Farbwechsel
    form1.Canvas.rectangle              //das Quadrat auf die Form zeichnen
    (a_x+x*feld_lx,a_y+y*feld_ly,
     a_x+((x+1)*feld_lx)+1,a_y+((y+1)*feld_ly)+1);


     if bittest(wk,z-1then m(1);
     //if bittest(sK,z-1) then m(-1);

  end;
  //form1.Canvas.Brush.style:=bsclear;
end;

function Round ( const Number : Extended ) : Int64;
begin

end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  bitset(wK,1);
  bitset(wk,40);
  bitset(wK,41);
  bitset(wK,39);
  bitclear(wk,40);
  bitclear(wK,39);
  label1.Caption:=inttostr(wk);
  schachbrett;
end;


procedure TForm1.FormCreate(Sender: TObject);
var y:byte;
begin
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  schachbrett;
end;


end.