Selaa lähdekoodia

* fixed TBits.NotBits, it is just an Xor operation, resolves #33706

git-svn-id: trunk@39243 -
florian 7 vuotta sitten
vanhempi
commit
400861a907
3 muutettua tiedostoa jossa 108 lisäystä ja 5 poistoa
  1. 1 0
      .gitattributes
  2. 1 5
      rtl/objpas/classes/bits.inc
  3. 106 0
      tests/webtbs/tw33706.pp

+ 1 - 0
.gitattributes

@@ -16152,6 +16152,7 @@ tests/webtbs/tw3360.pp svneol=native#text/plain
 tests/webtbs/tw33635.pp svneol=native#text/pascal
 tests/webtbs/tw3364.pp svneol=native#text/plain
 tests/webtbs/tw3366.pp svneol=native#text/plain
+tests/webtbs/tw33706.pp svneol=native#text/plain
 tests/webtbs/tw33818.pp svneol=native#text/pascal
 tests/webtbs/tw33839a.pp -text svneol=native#text/pascal
 tests/webtbs/tw33839b.pp -text svneol=native#text/pascal

+ 1 - 5
rtl/objpas/classes/bits.inc

@@ -193,7 +193,6 @@ end;
 procedure TBits.notbits(bitset : TBits);
 var
    n : longint;
-   jj : cardinal;
    loop : longint;
 begin
    if FSize < bitset.getFSize then
@@ -202,10 +201,7 @@ begin
       n := bitset.getFSize - 1;
 
    for loop := 0 to n do
-   begin
-      jj := FBits^[loop];
-      FBits^[loop] := FBits^[loop] and (jj xor bitset.FBits^[loop]);
-   end;
+      FBits^[loop] := FBits^[loop] xor bitset.FBits^[loop];
 end;
 
 procedure TBits.orbits(bitset : TBits);

+ 106 - 0
tests/webtbs/tw33706.pp

@@ -0,0 +1,106 @@
+{$mode objfpc}{$H+}
+
+uses
+  Classes, SysUtils;
+
+var
+  code: integer;
+
+function bitstostring(b: TBits): string;
+var
+  i: integer;
+  bs: string;
+begin
+  bs:= '';
+  for i:= 0 to b.Size - 1 do
+    if b[i] then
+      bs:= bs + '1'
+    else
+      bs:= bs + '0';
+  Result:= bs;
+end;
+
+procedure Test;
+var
+  i, bsize1, bsize2: integer;
+  b1, b2, b3: TBits;
+begin
+  code := 0;
+  // XOR
+  bsize1:= 16;
+  bsize2:= 164;
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    begin
+      b1[i]:= True;
+      b2[i]:= True;
+    end;
+
+  b2.NotBits(b1);
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('Not');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 1;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    begin
+      b1[i]:= True;
+      b3[i]:= True;
+    end;
+
+  b2.NotBits(b1);
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('Not');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 2;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    begin
+      b2[i]:= True;
+      b3[i]:= True;
+    end;
+
+  b2.NotBits(b1);
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('Not');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 4;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+end;
+
+begin
+  test;
+  if code=0 then
+    writeln('ok');
+  halt(code);
+end.
+
+