aboutsummaryrefslogtreecommitdiff
path: root/BigInt.c
diff options
context:
space:
mode:
Diffstat (limited to 'BigInt.c')
-rw-r--r--BigInt.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/BigInt.c b/BigInt.c
index 4ffee57..d5b1d20 100644
--- a/BigInt.c
+++ b/BigInt.c
@@ -1,10 +1,12 @@
#include "BigInt.h"
#include "MemoryManager.h"
#include "Types.h"
+#include <limits.h>
#include <string.h>
typedef uint_fast32_t UWord;
#define UWORD_MAX UINT_FAST32_MAX
+#define UWORD_BIT (sizeof(UWord) * CHAR_BIT)
/** Metadata **/
@@ -212,7 +214,7 @@ B_rshift(BigInt *intx, usize shift) {
struct BigIntMeta *bim = B_metadata(*intx);
UWord *x = *intx;
- usize word_moves = shift / (sizeof(UWord) * 8);
+ usize word_moves = shift / (sizeof(UWord) * CHAR_BIT);
if (word_moves) {
usize w = 0;
for (; w < bim->words - word_moves; ++w)
@@ -221,11 +223,11 @@ B_rshift(BigInt *intx, usize shift) {
x[w] = 0;
}
- usize bit_moves = shift % (sizeof(UWord) * 8);
+ usize bit_moves = shift % UWORD_BIT;
if (bit_moves == 1) {
x[0] >>= 1;
for (usize w = 1; w < bim->words; ++w) {
- x[w - 1] |= (x[w] & 1) << (sizeof(UWord) * 8 - 1);
+ x[w - 1] |= (x[w] & 1) << (UWORD_BIT - 1);
x[w] >>= 1;
}
}
@@ -234,7 +236,7 @@ B_rshift(BigInt *intx, usize shift) {
x[0] >>= bit_moves;
for (usize w = 1; w < bim->words; ++w) {
- x[w - 1] |= (x[w] & mask) << (sizeof(UWord) * 8 - bit_moves);
+ x[w - 1] |= (x[w] & mask) << (UWORD_BIT - bit_moves);
x[w] >>= bit_moves;
}
}
@@ -253,7 +255,7 @@ B_lshift(BigInt *intx, usize shift) {
struct BigIntMeta *bim = B_metadata(*intx);
UWord *x = *intx;
- usize word_moves = shift / (sizeof(UWord) * 8);
+ usize word_moves = shift / UWORD_BIT;
if (word_moves) {
usize w = bim->words - 1;
for (; w >= word_moves; --w)
@@ -262,22 +264,22 @@ B_lshift(BigInt *intx, usize shift) {
x[w] = 0;
}
- usize bit_moves = shift % (sizeof(UWord) * 8);
+ usize bit_moves = shift % UWORD_BIT;
if (bit_moves == 1) {
- UWord mask = (UWord)1 << (sizeof(UWord) * 8 - 1);
+ UWord mask = (UWord)1 << (UWORD_BIT - 1);
x[bim->words - 1] <<= 1;
for (usize w = bim->words - 2; w < bim->words; --w) {
- x[w + 1] |= (x[w] & mask) >> (sizeof(UWord) * 8 - 1);
+ x[w + 1] |= (x[w] & mask) >> (UWORD_BIT - 1);
x[w] <<= 1;
}
}
else if (bit_moves > 1) {
- UWord mask = (((UWord)1 << bit_moves) - 1) << (sizeof(UWord) * 8 - bit_moves);
+ UWord mask = (((UWord)1 << bit_moves) - 1) << (UWORD_BIT - bit_moves);
x[bim->words - 1] <<= bit_moves;
for (usize w = bim->words - 2; w < bim->words; --w) {
- x[w + 1] |= (x[w] & mask) >> (sizeof(UWord) * 8 - bit_moves);
+ x[w + 1] |= (x[w] & mask) >> (UWORD_BIT - bit_moves);
x[w] <<= bit_moves;
}
}
@@ -306,8 +308,8 @@ B_bitwidth(BigInt intx) {
if (x[w] == 0) continue;
// TODO: use faster search than linear
- usize width = sizeof(UWord) * 8 * (w + 1);
- for (UWord mask = (UWord)1 << (sizeof(UWord) * 8 - 1); mask > 0; mask >>= 1, --width) {
+ usize width = UWORD_BIT * (w + 1);
+ for (UWord mask = (UWord)1 << (UWORD_BIT - 1); mask > 0; mask >>= 1, --width) {
if (x[w] & mask)
return width;
}