diff options
| -rw-r--r-- | BigInt.c | 26 |
1 files changed, 14 insertions, 12 deletions
@@ -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; } |
