Autor Beitrag
gerd8888
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: So 28.08.16 11:15 
Hallo,

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

ausblenden 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: So 28.08.16 11:43 
Ich glaube ich habe es selbst gefunden:

ausblenden Delphi-Quelltext
1:
Result := (testzahl and (Int64(1shl bitnr)) <> 0;					
gerd8888 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: 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.
ausblenden volle Höhe 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.