mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-30 00:59:17 +02:00
* TBits.ORBits and TBits.XORBits: properly handle case when other TBits object has smaller Size. Mantis #25289.
git-svn-id: trunk@26121 -
This commit is contained in:
parent
494d79bd7e
commit
43c96cd898
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -13712,6 +13712,7 @@ tests/webtbs/tw25198.pp svneol=native#text/plain
|
||||
tests/webtbs/tw25210.pp svneol=native#text/pascal
|
||||
tests/webtbs/tw2525.pp svneol=native#text/plain
|
||||
tests/webtbs/tw25269.pp svneol=native#text/pascal
|
||||
tests/webtbs/tw25289.pp svneol=native#text/plain
|
||||
tests/webtbs/tw25318.pp svneol=native#text/pascal
|
||||
tests/webtbs/tw25349.pp svneol=native#text/plain
|
||||
tests/webtbs/tw2536.pp svneol=native#text/plain
|
||||
|
@ -212,10 +212,9 @@ procedure TBits.orbits(bitset : TBits);
|
||||
var
|
||||
loop : longint;
|
||||
begin
|
||||
if FBSize < bitset.Size then
|
||||
grow(bitset.Size);
|
||||
grow(bitset.Size);
|
||||
|
||||
for loop := 0 to FSize-1 do
|
||||
for loop := 0 to bitset.getFSize-1 do
|
||||
FBits^[loop] := FBits^[loop] or bitset.FBits^[loop];
|
||||
end;
|
||||
|
||||
@ -223,10 +222,9 @@ procedure TBits.xorbits(bitset : TBits);
|
||||
var
|
||||
loop : longint;
|
||||
begin
|
||||
if FBSize < bitset.Size then
|
||||
grow(bitset.Size);
|
||||
grow(bitset.Size);
|
||||
|
||||
for loop := 0 to FSize-1 do
|
||||
for loop := 0 to bitset.getFSize-1 do
|
||||
FBits^[loop] := FBits^[loop] xor bitset.FBits^[loop];
|
||||
end;
|
||||
|
||||
|
110
tests/webtbs/tw25289.pp
Normal file
110
tests/webtbs/tw25289.pp
Normal file
@ -0,0 +1,110 @@
|
||||
{$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;
|
||||
// OR
|
||||
bsize1:= 16;
|
||||
bsize2:= 164;
|
||||
b1:= TBits.Create;
|
||||
b2:= TBits.Create(bsize2);
|
||||
b3:= TBits.Create(bsize2);
|
||||
for i:= 0 to bsize1 - 1 do
|
||||
b1[i]:= True;
|
||||
|
||||
b2.OrBits(b1);
|
||||
b3.OrBits(b1);
|
||||
for i:= b1.Size to bsize2 - 1 do
|
||||
b3[i]:= False;
|
||||
if not b2.Equals(b3) then
|
||||
begin
|
||||
WriteLn('OR');
|
||||
writeln(bitstostring(b1));
|
||||
writeln(bitstostring(b2));
|
||||
writeln(bitstostring(b3));
|
||||
code := code or 1;
|
||||
end;
|
||||
b1.Free;
|
||||
b2.Free;
|
||||
b3.Free;
|
||||
|
||||
// XOR
|
||||
bsize1:= 16;
|
||||
bsize2:= 164;
|
||||
b1:= TBits.Create;
|
||||
b2:= TBits.Create(bsize2);
|
||||
b3:= TBits.Create(bsize2);
|
||||
for i:= 0 to bsize1 - 1 do
|
||||
b1[i]:= True;
|
||||
|
||||
b2.XOrBits(b1);
|
||||
b3.XOrBits(b1);
|
||||
for i:= b1.Size to bsize2 - 1 do
|
||||
b3[i]:= False;
|
||||
if not b2.Equals(b3) then
|
||||
begin
|
||||
WriteLn('XOR');
|
||||
writeln(bitstostring(b1));
|
||||
writeln(bitstostring(b2));
|
||||
writeln(bitstostring(b3));
|
||||
code := code or 2;
|
||||
end;
|
||||
b1.Free;
|
||||
b2.Free;
|
||||
b3.Free;
|
||||
|
||||
// AND
|
||||
bsize1:= 16;
|
||||
bsize2:= 164;
|
||||
b1:= TBits.Create;
|
||||
b2:= TBits.Create(bsize2);
|
||||
b3:= TBits.Create(bsize2);
|
||||
for i:= 0 to bsize1 - 1 do
|
||||
b1[i]:= True;
|
||||
|
||||
b2.AndBits(b1);
|
||||
b3.AndBits(b1);
|
||||
for i:= b1.Size to bsize2 - 1 do
|
||||
b3[i]:= False;
|
||||
if not b2.Equals(b3) then
|
||||
begin
|
||||
WriteLn('AND');
|
||||
writeln(bitstostring(b1));
|
||||
writeln(bitstostring(b2));
|
||||
writeln(bitstostring(b3));
|
||||
code := code or 4;
|
||||
end;
|
||||
b1.Free;
|
||||
b2.Free;
|
||||
b3.Free;
|
||||
end;
|
||||
|
||||
begin
|
||||
test;
|
||||
halt(code);
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user