mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(big) add SBigIsEven
This commit is contained in:
parent
328bbf61d8
commit
6759cb4d7c
5 changed files with 34 additions and 0 deletions
|
|
@ -69,6 +69,10 @@ void SBigInc(BigData* a, BigData* b) {
|
||||||
Add(a->Primary(), b->Primary(), 1);
|
Add(a->Primary(), b->Primary(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t SBigIsEven(BigData* a) {
|
||||||
|
return IsEven(a->Primary());
|
||||||
|
}
|
||||||
|
|
||||||
void SBigMod(BigData* a, BigData* b, BigData* c) {
|
void SBigMod(BigData* a, BigData* b, BigData* c) {
|
||||||
uint32_t allocCount = 0;
|
uint32_t allocCount = 0;
|
||||||
auto& scratch = a->Stack().Alloc(&allocCount);
|
auto& scratch = a->Stack().Alloc(&allocCount);
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ void SBigFromUnsigned(BigData* num, uint32_t val);
|
||||||
|
|
||||||
void SBigInc(BigData* a, BigData* b);
|
void SBigInc(BigData* a, BigData* b);
|
||||||
|
|
||||||
|
int32_t SBigIsEven(BigData* a);
|
||||||
|
|
||||||
void SBigMod(BigData* a, BigData* b, BigData* c);
|
void SBigMod(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
||||||
void SBigMul(BigData* a, BigData* b, BigData* c);
|
void SBigMul(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,10 @@ void InsertLowPart(uint64_t& value, uint32_t low) {
|
||||||
value = (value << 32) | low;
|
value = (value << 32) | low;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t IsEven(const BigBuffer &num) {
|
||||||
|
return num.Count() == 0 || (num[0] & 1) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t MakeLarge(uint32_t low, uint32_t high) {
|
uint64_t MakeLarge(uint32_t low, uint32_t high) {
|
||||||
return low + (static_cast<uint64_t>(high) << 32);
|
return low + (static_cast<uint64_t>(high) << 32);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,8 @@ uint32_t HighBitPos(const BigBuffer& buffer);
|
||||||
|
|
||||||
void InsertLowPart(uint64_t& value, uint32_t low);
|
void InsertLowPart(uint64_t& value, uint32_t low);
|
||||||
|
|
||||||
|
int32_t IsEven(const BigBuffer &num);
|
||||||
|
|
||||||
uint64_t MakeLarge(uint32_t low, uint32_t high);
|
uint64_t MakeLarge(uint32_t low, uint32_t high);
|
||||||
|
|
||||||
void Mul(BigBuffer& a, const BigBuffer& b, uint64_t c);
|
void Mul(BigBuffer& a, const BigBuffer& b, uint64_t c);
|
||||||
|
|
|
||||||
22
test/Big.cpp
22
test/Big.cpp
|
|
@ -426,6 +426,28 @@ TEST_CASE("SBigInc", "[big]") {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SBigIsEven", "[big]") {
|
||||||
|
BigDataTest a;
|
||||||
|
|
||||||
|
SECTION("unset zero is even") {
|
||||||
|
CHECK(SBigIsEven(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("numbers are even") {
|
||||||
|
auto v = GENERATE(0ULL, 2ULL, 10ULL, 10000ULL, 0xFFFFFFFEULL, 0x9999888877776666ULL);
|
||||||
|
|
||||||
|
SBigFromStr(a, std::to_string(v).c_str());
|
||||||
|
CHECK(SBigIsEven(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("numbers are not even") {
|
||||||
|
auto v = GENERATE(1ULL, 3ULL, 37ULL, 999999999ULL, 0xFFFFFFFFFULL, 0x9999888877776667ULL);
|
||||||
|
|
||||||
|
SBigFromStr(a, std::to_string(v).c_str());
|
||||||
|
CHECK_FALSE(SBigIsEven(a));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("SBigMod", "[big]") {
|
TEST_CASE("SBigMod", "[big]") {
|
||||||
SECTION("mods 7 by 4") {
|
SECTION("mods 7 by 4") {
|
||||||
BigData* a;
|
BigData* a;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue