sherlockmeister
2008-04-05 18:48:42
your basic add,subtract,multiply,divide operations using only shifts,bitwise operations. not meant for use, just for fun. note that my division wasn't particularly elegant and you won't get corresponding values for divide(x,y) to x/y in rare cases like $8000000/y (actually mine is more accurate). other than that everything else seems to check out. enjoy.
function Add(A, B: Integer): Integer;
begin
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := Result and A shl 1;
A := B xor Result;
B := B and Result shl 1;
Result := A xor B;
A := A and B shl 1;
B := Result xor A;
Result := B;
end;
function Subtract(A, B: Integer): Integer;
begin
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
B := B and A shl 1;
A := A xor B;
Result := A;
end;
function Multiply(A, B: Integer): Integer;
var
C: Integer;
begin
C := 1431655765 xor 1431655765 shl (A and 1);
Result := Add(Result, B and C);
C := 1431655765 xor 1431655765 shl (A shr 1 and 1);
Result := Add(Result, B and C shl 1);
C := 1431655765 xor 1431655765 shl (A shr 2 and 1);
Result := Add(Result, B and C shl 2);
C := 1431655765 xor 1431655765 shl (A shr 3 and 1);
Result := Add(Result, B and C shl 3);
C := 1431655765 xor 1431655765 shl (A shr 4 and 1);
Result := Add(Result, B and C shl 4);
C := 1431655765 xor 1431655765 shl (A shr 5 and 1);
Result := Add(Result, B and C shl 5);
C := 1431655765 xor 1431655765 shl (A shr 6 and 1);
Result := Add(Result, B and C shl 6);
C := 1431655765 xor 1431655765 shl (A shr 7 and 1);
Result := Add(Result, B and C shl 7);
C := 1431655765 xor 1431655765 shl (A shr 8 and 1);
Result := Add(Result, B and C shl 8);
C := 1431655765 xor 1431655765 shl (A shr 9 and 1);
Result := Add(Result, B and C shl 9);
C := 1431655765 xor 1431655765 shl (A shr 10 and 1);
Result := Add(Result, B and C shl 10);
C := 1431655765 xor 1431655765 shl (A shr 11 and 1);
Result := Add(Result, B and C shl 11);
C := 1431655765 xor 1431655765 shl (A shr 12 and 1);
Result := Add(Result, B and C shl 12);
C := 1431655765 xor 1431655765 shl (A shr 13 and 1);
Result := Add(Result, B and C shl 13);
C := 1431655765 xor 1431655765 shl (A shr 14 and 1);
Result := Add(Result, B and C shl 14);
C := 1431655765 xor 1431655765 shl (A shr 15 and 1);
Result := Add(Result, B and C shl 15);
C := 1431655765 xor 1431655765 shl (A shr 16 and 1);
Result := Add(Result, B and C shl 16);
C := 1431655765 xor 1431655765 shl (A shr 17 and 1);
Result := Add(Result, B and C shl 17);
C := 1431655765 xor 1431655765 shl (A shr 18 and 1);
Result := Add(Result, B and C shl 18);
C := 1431655765 xor 1431655765 shl (A shr 19 and 1);
Result := Add(Result, B and C shl 19);
C := 1431655765 xor 1431655765 shl (A shr 20 and 1);
Result := Add(Result, B and C shl 20);
C := 1431655765 xor 1431655765 shl (A shr 21 and 1);
Result := Add(Result, B and C shl 21);
C := 1431655765 xor 1431655765 shl (A shr 22 and 1);
Result := Add(Result, B and C shl 22);
C := 1431655765 xor 1431655765 shl (A shr 23 and 1);
Result := Add(Result, B and C shl 23);
C := 1431655765 xor 1431655765 shl (A shr 24 and 1);
Result := Add(Result, B and C shl 24);
C := 1431655765 xor 1431655765 shl (A shr 25 and 1);
Result := Add(Result, B and C shl 25);
C := 1431655765 xor 1431655765 shl (A shr 26 and 1);
Result := Add(Result, B and C shl 26);
C := 1431655765 xor 1431655765 shl (A shr 27 and 1);
Result := Add(Result, B and C shl 27);
C := 1431655765 xor 1431655765 shl (A shr 28 and 1);
Result := Add(Result, B and C shl 28);
C := 1431655765 xor 1431655765 shl (A shr 29 and 1);
Result := Add(Result, B and C shl 29);
C := 1431655765 xor 1431655765 shl (A shr 30 and 1);
Result := Add(Result, B and C shl 30);
C := 1431655765 xor 1431655765 shl (A shr 31 and 1);
Result := Add(Result, B and C shl 31);
end;
function Compare(A, B: Integer): Integer;
var
C, D: Integer;
begin
C := A xor B;
Result := 1;
D := 1431655765 xor 1431655765 shl (C shr 1 and 1);
Result := 1 and D;
D := 1431655765 xor 1431655765 shl (C shr 2 and 1);
Result := (2 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 3 and 1);
Result := (3 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 4 and 1);
Result := (4 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 5 and 1);
Result := (5 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 6 and 1);
Result := (6 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 7 and 1);
Result := (7 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 8 and 1);
Result := (8 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 9 and 1);
Result := (9 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 10 and 1);
Result := (10 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 11 and 1);
Result := (11 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 12 and 1);
Result := (12 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 13 and 1);
Result := (13 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 14 and 1);
Result := (14 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 15 and 1);
Result := (15 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 16 and 1);
Result := (16 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 17 and 1);
Result := (17 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 18 and 1);
Result := (18 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 19 and 1);
Result := (19 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 20 and 1);
Result := (20 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 21 and 1);
Result := (21 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 22 and 1);
Result := (22 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 23 and 1);
Result := (23 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 24 and 1);
Result := (24 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 25 and 1);
Result := (25 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 26 and 1);
Result := (26 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 27 and 1);
Result := (27 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 28 and 1);
Result := (28 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 29 and 1);
Result := (29 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 30 and 1);
Result := (30 and D) or (Result and not D);
D := 1431655765 xor 1431655765 shl (C shr 31 and 1);
Result := (31 and D) or (Result and not D);
Result := (A shr Result and 1) or (B shr Result and 1 xor 1);
end;
function Divide(A, B: Integer): Integer;
var
C, D: Integer;
begin
C := 1431655765 xor 1431655765 shl ((A xor B) shr 31);
A := Add(A xor (1431655765 xor 1431655765 shl
(A shr 31)), A shr 31);
B := Add(B xor (1431655765 xor 1431655765 shl
(B shr 31)), B shr 31);
D := Compare(A, B shl 30) and Compare(B and 3, B);
Result := Result or D shl 30;
A := Subtract(A, B shl 30 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 29) and Compare(B and 7, B);
Result := Result or D shl 29;
A := Subtract(A, B shl 29 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 28) and Compare(B and 15, B);
Result := Result or D shl 28;
A := Subtract(A, B shl 28 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 27) and Compare(B and 31, B);
Result := Result or D shl 27;
A := Subtract(A, B shl 27 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 26) and Compare(B and 63, B);
Result := Result or D shl 26;
A := Subtract(A, B shl 26 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 25) and Compare(B and 127, B);
Result := Result or D shl 25;
A := Subtract(A, B shl 25 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 24) and Compare(B and 255, B);
Result := Result or D shl 24;
A := Subtract(A, B shl 24 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 23) and Compare(B and 511, B);
Result := Result or D shl 23;
A := Subtract(A, B shl 23 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 22) and Compare(B and 1023, B);
Result := Result or D shl 22;
A := Subtract(A, B shl 22 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 21) and Compare(B and 2047, B);
Result := Result or D shl 21;
A := Subtract(A, B shl 21 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 20) and Compare(B and 4095, B);
Result := Result or D shl 20;
A := Subtract(A, B shl 20 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 19) and Compare(B and 8191, B);
Result := Result or D shl 19;
A := Subtract(A, B shl 19 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 18) and Compare(B and 16383, B);
Result := Result or D shl 18;
A := Subtract(A, B shl 18 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 17) and Compare(B and 32767, B);
Result := Result or D shl 17;
A := Subtract(A, B shl 17 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 16) and Compare(B and 65535, B);
Result := Result or D shl 16;
A := Subtract(A, B shl 16 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 15) and Compare(B and 131071, B);
Result := Result or D shl 15;
A := Subtract(A, B shl 15 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 14) and Compare(B and 262143, B);
Result := Result or D shl 14;
A := Subtract(A, B shl 14 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 13) and Compare(B and 524287, B);
Result := Result or D shl 13;
A := Subtract(A, B shl 13 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 12) and Compare(B and 1048575, B);
Result := Result or D shl 12;
A := Subtract(A, B shl 12 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 11) and Compare(B and 2097151, B);
Result := Result or D shl 11;
A := Subtract(A, B shl 11 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 10) and Compare(B and 4194303, B);
Result := Result or D shl 10;
A := Subtract(A, B shl 10 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 9) and Compare(B and 8388607, B);
Result := Result or D shl 9;
A := Subtract(A, B shl 9 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 8) and Compare(B and 16777215, B);
Result := Result or D shl 8;
A := Subtract(A, B shl 8 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 7) and Compare(B and 33554431, B);
Result := Result or D shl 7;
A := Subtract(A, B shl 7 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 6) and Compare(B and 67108863, B);
Result := Result or D shl 6;
A := Subtract(A, B shl 6 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 5) and Compare(B and 134217727, B);
Result := Result or D shl 5;
A := Subtract(A, B shl 5 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 4) and Compare(B and 268435455, B);
Result := Result or D shl 4;
A := Subtract(A, B shl 4 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 3) and Compare(B and 536870911, B);
Result := Result or D shl 3;
A := Subtract(A, B shl 3 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 2) and Compare(B and 1073741823, B);
Result := Result or D shl 2;
A := Subtract(A, B shl 2 and (1431655765 xor 1431655765 shl D));
D := Compare(A, B shl 1) and Compare(B and 2147483647, B);
Result := Result or D shl 1;
A := Subtract(A, B shl 1 and (1431655765 xor 1431655765 shl D));
Result := Result or Compare(A, B);
Result := Add(Result xor C, C and 1);
end;