mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(big): add SBigOr
This commit is contained in:
parent
5688b7ec3e
commit
c31e976595
5 changed files with 67 additions and 0 deletions
|
|
@ -107,6 +107,10 @@ void SBigNot(BigData* a, BigData* b) {
|
||||||
Not(a->Primary(), b->Primary());
|
Not(a->Primary(), b->Primary());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SBigOr(BigData* a, BigData* b, BigData* c) {
|
||||||
|
Or(a->Primary(), b->Primary(), c->Primary());
|
||||||
|
}
|
||||||
|
|
||||||
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d) {
|
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d) {
|
||||||
PowMod(a->Primary(), b->Primary(), c->Primary(), d->Primary(), a->Stack());
|
PowMod(a->Primary(), b->Primary(), c->Primary(), d->Primary(), a->Stack());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@ void SBigNew(BigData** num);
|
||||||
|
|
||||||
void SBigNot(BigData* a, BigData* b);
|
void SBigNot(BigData* a, BigData* b);
|
||||||
|
|
||||||
|
void SBigOr(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
||||||
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d);
|
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d);
|
||||||
|
|
||||||
void SBigShl(BigData* a, BigData* b, uint32_t shift);
|
void SBigShl(BigData* a, BigData* b, uint32_t shift);
|
||||||
|
|
|
||||||
|
|
@ -286,6 +286,15 @@ void Not(BigBuffer& a, const BigBuffer& b) {
|
||||||
a.SetCount(i);
|
a.SetCount(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Or(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) {
|
||||||
|
uint32_t i = 0;
|
||||||
|
for (; b.IsUsed(i) || c.IsUsed(i); i++) {
|
||||||
|
a[i] = c[i] | b[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
a.SetCount(i);
|
||||||
|
}
|
||||||
|
|
||||||
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack) {
|
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack) {
|
||||||
c.Trim();
|
c.Trim();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,8 @@ void MulMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffe
|
||||||
|
|
||||||
void Not(BigBuffer& a, const BigBuffer& b);
|
void Not(BigBuffer& a, const BigBuffer& b);
|
||||||
|
|
||||||
|
void Or(BigBuffer& a, const BigBuffer& b, const BigBuffer& c);
|
||||||
|
|
||||||
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack);
|
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack);
|
||||||
|
|
||||||
void SetOne(BigBuffer& buffer);
|
void SetOne(BigBuffer& buffer);
|
||||||
|
|
|
||||||
50
test/Big.cpp
50
test/Big.cpp
|
|
@ -769,6 +769,56 @@ TEST_CASE("SBigNot", "[big]") {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SBigOr", "[big]") {
|
||||||
|
BigDataTest a, b, c;
|
||||||
|
|
||||||
|
SECTION("performs bitwise or on small numbers") {
|
||||||
|
auto v = GENERATE(
|
||||||
|
std::make_pair(0UL, 0UL),
|
||||||
|
std::make_pair(0UL, 123UL),
|
||||||
|
std::make_pair(41689UL, 786740UL)
|
||||||
|
);
|
||||||
|
|
||||||
|
SBigFromUnsigned(b, v.first);
|
||||||
|
SBigFromUnsigned(c, v.second);
|
||||||
|
SBigOr(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == (v.first | v.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("performs bitwise or on large numbers") {
|
||||||
|
auto v = GENERATE(
|
||||||
|
std::make_pair(0xFF00FF00FF00FF00ULL, 0xFF00FF00FF00FFULL)
|
||||||
|
);
|
||||||
|
|
||||||
|
SBigFromStr(b, std::to_string(v.first).c_str());
|
||||||
|
SBigFromStr(c, std::to_string(v.second).c_str());
|
||||||
|
SBigOr(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 2);
|
||||||
|
CHECK(a->Primary()[0] == uint32_t(v.first | v.second));
|
||||||
|
CHECK(a->Primary()[1] == uint32_t((v.first | v.second) >> 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("performs bitwise or on huge value") {
|
||||||
|
uint32_t data[] = { 0xF00DFEEDUL, 0xBA1DUL, 0xBEEBBEEBUL, 0x12345678UL, 0x9ABCDEFUL, 0xDEADCADUL, 0xD011AUL };
|
||||||
|
|
||||||
|
SBigFromBinary(b, data, sizeof(data));
|
||||||
|
SBigFromUnsigned(c, 0x11111111UL);
|
||||||
|
SBigOr(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 7);
|
||||||
|
CHECK(a->Primary()[0] == 0xF11DFFFD);
|
||||||
|
CHECK(a->Primary()[1] == data[1]);
|
||||||
|
CHECK(a->Primary()[2] == data[2]);
|
||||||
|
CHECK(a->Primary()[3] == data[3]);
|
||||||
|
CHECK(a->Primary()[4] == data[4]);
|
||||||
|
CHECK(a->Primary()[5] == data[5]);
|
||||||
|
CHECK(a->Primary()[6] == data[6]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("SBigShl", "[big]") {
|
TEST_CASE("SBigShl", "[big]") {
|
||||||
SECTION("shifts 256 left 7 bits") {
|
SECTION("shifts 256 left 7 bits") {
|
||||||
BigData* a;
|
BigData* a;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue