added: UInt::BitAnd(), UInt::BitOr(), UInt::BitXor(), UInt::BitNot(),
Big::BitAnd(), Big::BitOr(), Big::BitXor() added: to the parser: bitand(), bitor(), bitxor() /band(), bor(), bxor()/ git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@36 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
062881900a
commit
2116418f08
4
TODO
4
TODO
|
@ -1,7 +1,5 @@
|
||||||
TODO TTMath Library
|
TODO TTMath Library
|
||||||
===================
|
===================
|
||||||
|
|
||||||
* Add bitwise operators (or functions) and, or, xor
|
|
||||||
* Add functions for generating random values
|
* Add functions for generating random values
|
||||||
|
* Add something like NaN to the Big<> type
|
||||||
|
|
||||||
|
|
|
@ -616,6 +616,145 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
bitwise AND
|
||||||
|
|
||||||
|
this and ss2 must be >= 0
|
||||||
|
return values:
|
||||||
|
0 - ok
|
||||||
|
1 - carry
|
||||||
|
2 - this or ss2 was negative
|
||||||
|
*/
|
||||||
|
uint BitAnd(Big<exp, man> ss2)
|
||||||
|
{
|
||||||
|
if( IsSign() || ss2.IsSign() )
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
Int<exp> exp_offset( exponent );
|
||||||
|
Int<exp> mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT );
|
||||||
|
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
exp_offset.Sub( ss2.exponent );
|
||||||
|
exp_offset.Abs();
|
||||||
|
|
||||||
|
// abs(this) will be >= abs(ss2)
|
||||||
|
if( SmallerWithoutSignThan(ss2) )
|
||||||
|
{
|
||||||
|
Big<exp, man> temp(ss2);
|
||||||
|
|
||||||
|
ss2 = *this;
|
||||||
|
*this = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( exp_offset >= mantissa_size_in_bits )
|
||||||
|
{
|
||||||
|
// the second value is too short
|
||||||
|
SetZero();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// exp_offset < mantissa_size_in_bits, moving 'exp_offset' times
|
||||||
|
ss2.mantissa.Rcr( exp_offset.ToInt(), 0 );
|
||||||
|
mantissa.BitAnd(ss2.mantissa);
|
||||||
|
|
||||||
|
c += Standardizing();
|
||||||
|
|
||||||
|
return (c==0)? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
bitwise OR
|
||||||
|
|
||||||
|
this and ss2 must be >= 0
|
||||||
|
return values:
|
||||||
|
0 - ok
|
||||||
|
1 - carry
|
||||||
|
2 - this or ss2 was negative
|
||||||
|
*/
|
||||||
|
uint BitOr(Big<exp, man> ss2)
|
||||||
|
{
|
||||||
|
if( IsSign() || ss2.IsSign() )
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
Int<exp> exp_offset( exponent );
|
||||||
|
Int<exp> mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT );
|
||||||
|
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
exp_offset.Sub( ss2.exponent );
|
||||||
|
exp_offset.Abs();
|
||||||
|
|
||||||
|
// abs(this) will be >= abs(ss2)
|
||||||
|
if( SmallerWithoutSignThan(ss2) )
|
||||||
|
{
|
||||||
|
Big<exp, man> temp(ss2);
|
||||||
|
|
||||||
|
ss2 = *this;
|
||||||
|
*this = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( exp_offset >= mantissa_size_in_bits )
|
||||||
|
// the second value is too short
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// exp_offset < mantissa_size_in_bits, moving 'exp_offset' times
|
||||||
|
ss2.mantissa.Rcr( exp_offset.ToInt(), 0 );
|
||||||
|
mantissa.BitOr(ss2.mantissa);
|
||||||
|
|
||||||
|
c += Standardizing();
|
||||||
|
|
||||||
|
return (c==0)? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
bitwise XOR
|
||||||
|
|
||||||
|
this and ss2 must be >= 0
|
||||||
|
return values:
|
||||||
|
0 - ok
|
||||||
|
1 - carry
|
||||||
|
2 - this or ss2 was negative
|
||||||
|
*/
|
||||||
|
uint BitXor(Big<exp, man> ss2)
|
||||||
|
{
|
||||||
|
if( IsSign() || ss2.IsSign() )
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
Int<exp> exp_offset( exponent );
|
||||||
|
Int<exp> mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT );
|
||||||
|
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
exp_offset.Sub( ss2.exponent );
|
||||||
|
exp_offset.Abs();
|
||||||
|
|
||||||
|
// abs(this) will be >= abs(ss2)
|
||||||
|
if( SmallerWithoutSignThan(ss2) )
|
||||||
|
{
|
||||||
|
Big<exp, man> temp(ss2);
|
||||||
|
|
||||||
|
ss2 = *this;
|
||||||
|
*this = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( exp_offset >= mantissa_size_in_bits )
|
||||||
|
// the second value is too short
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// exp_offset < mantissa_size_in_bits, moving 'exp_offset' times
|
||||||
|
ss2.mantissa.Rcr( exp_offset.ToInt(), 0 );
|
||||||
|
mantissa.BitXor(ss2.mantissa);
|
||||||
|
|
||||||
|
c += Standardizing();
|
||||||
|
|
||||||
|
return (c==0)? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Multiplication this = this * ss2 (ss2 is uint)
|
Multiplication this = this * ss2 (ss2 is uint)
|
||||||
|
|
||||||
|
|
|
@ -1097,6 +1097,67 @@ void ACoth(int sindex, int amount_of_args, ValueType & result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BitAnd(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
if( amount_of_args != 2 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
uint err;
|
||||||
|
result = stack[sindex].value;
|
||||||
|
err = result.BitAnd(stack[sindex+2].value);
|
||||||
|
|
||||||
|
switch(err)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
Error( err_overflow );
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Error( err_improper_argument );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitOr(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
if( amount_of_args != 2 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
uint err;
|
||||||
|
result = stack[sindex].value;
|
||||||
|
err = result.BitOr(stack[sindex+2].value);
|
||||||
|
|
||||||
|
switch(err)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
Error( err_overflow );
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Error( err_improper_argument );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BitXor(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
if( amount_of_args != 2 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
uint err;
|
||||||
|
result = stack[sindex].value;
|
||||||
|
err = result.BitXor(stack[sindex+2].value);
|
||||||
|
|
||||||
|
switch(err)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
Error( err_overflow );
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Error( err_improper_argument );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method returns the value from a user-defined function
|
this method returns the value from a user-defined function
|
||||||
|
|
||||||
|
@ -1252,6 +1313,12 @@ void CreateFunctionsTable()
|
||||||
InsertFunctionToTable(std::string("atgh"), &Parser<ValueType>::ATanh);
|
InsertFunctionToTable(std::string("atgh"), &Parser<ValueType>::ATanh);
|
||||||
InsertFunctionToTable(std::string("acoth"), &Parser<ValueType>::ACoth);
|
InsertFunctionToTable(std::string("acoth"), &Parser<ValueType>::ACoth);
|
||||||
InsertFunctionToTable(std::string("actgh"), &Parser<ValueType>::ACoth);
|
InsertFunctionToTable(std::string("actgh"), &Parser<ValueType>::ACoth);
|
||||||
|
InsertFunctionToTable(std::string("bitand"), &Parser<ValueType>::BitAnd);
|
||||||
|
InsertFunctionToTable(std::string("bitor"), &Parser<ValueType>::BitOr);
|
||||||
|
InsertFunctionToTable(std::string("bitxor"), &Parser<ValueType>::BitXor);
|
||||||
|
InsertFunctionToTable(std::string("band"), &Parser<ValueType>::BitAnd);
|
||||||
|
InsertFunctionToTable(std::string("bor"), &Parser<ValueType>::BitOr);
|
||||||
|
InsertFunctionToTable(std::string("bxor"), &Parser<ValueType>::BitXor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1489,6 +1489,48 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method performs a bitwise operation AND
|
||||||
|
*/
|
||||||
|
void BitAnd(const UInt<value_size> & ss2)
|
||||||
|
{
|
||||||
|
for(uint x=0 ; x<value_size ; ++x)
|
||||||
|
table[x] &= ss2.table[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method performs a bitwise operation OR
|
||||||
|
*/
|
||||||
|
void BitOr(const UInt<value_size> & ss2)
|
||||||
|
{
|
||||||
|
for(uint x=0 ; x<value_size ; ++x)
|
||||||
|
table[x] |= ss2.table[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method performs a bitwise operation XOR
|
||||||
|
*/
|
||||||
|
void BitXor(const UInt<value_size> & ss2)
|
||||||
|
{
|
||||||
|
for(uint x=0 ; x<value_size ; ++x)
|
||||||
|
table[x] ^= ss2.table[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method performs a bitwise operation NOT
|
||||||
|
*/
|
||||||
|
void BitNot()
|
||||||
|
{
|
||||||
|
for(uint x=0 ; x<value_size ; ++x)
|
||||||
|
table[x] = ~table[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
*
|
*
|
||||||
* Multiplication
|
* Multiplication
|
||||||
|
@ -1499,7 +1541,7 @@ public:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TTMATH_PLATFORM32
|
#ifdef TTMATH_PLATFORM32
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue