Skip to content

Commit 541201e

Browse files
committed
improved the code of left shift operator
1 parent 91dd68a commit 541201e

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

include/epi/epi.hpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -817,36 +817,51 @@ namespace epi {
817817

818818
// shift operators : start
819819

820+
/// code improved/refactored times: 1x
820821
constexpr whole_number &operator<<=(size_t lshift) noexcept {
821-
return (*this = *this << lshift);
822+
size_t lshift_internal = lshift % bits_n;
823+
size_t limb_shifts = lshift_internal / LIMB_BITS;
824+
size_t bit_shifts = lshift_internal % LIMB_BITS;
825+
826+
cast_t shifted_bits = 0;
827+
828+
limbs[limb_n - 1] = limbs[limb_n - 1 - limb_shifts] << bit_shifts;
829+
830+
for (size_t i = limb_n - 2; i >= limb_shifts && i < limb_n; i--) {
831+
shifted_bits = static_cast<cast_t>(limbs[i - limb_shifts]) << bit_shifts;
832+
limbs[i] = static_cast<limb_t>(shifted_bits);
833+
limbs[i + 1] |= static_cast<limb_t>(shifted_bits >> LIMB_BITS);
834+
}
835+
836+
for (size_t i = 0; i < limb_shifts; i++) {
837+
limbs[i] = 0;
838+
}
839+
840+
return *this;
822841
}
823842

843+
/// code improved/refactored times: 1x
824844
constexpr whole_number operator<<(size_t lshift) const noexcept {
825845
whole_number result;
826846

827847
size_t lshift_internal = lshift % bits_n;
828848
size_t limb_shifts = lshift_internal / LIMB_BITS;
829849
size_t bit_shifts = lshift_internal % LIMB_BITS;
830-
size_t index = 0;
831850

832-
cast_t shifted_index = 0;
851+
cast_t shifted_bits = 0;
833852

834-
for (; index < limb_n - 1 - limb_shifts; ++index) {
835-
// memcpy alternative
836-
shifted_index = static_cast<cast_t>(limbs[index + 1]);
837-
shifted_index <<= LIMB_BITS;
838-
shifted_index |= static_cast<cast_t>(limbs[index]);
853+
result.limbs[limb_n - 1] = limbs[limb_n - 1 - limb_shifts] << bit_shifts;
839854

840-
// apply shifts
841-
shifted_index <<= bit_shifts;
842-
result.limbs[index + limb_shifts] |= static_cast<limb_t>(shifted_index);
843-
result.limbs[index + limb_shifts + 1] = static_cast<limb_t>(shifted_index >> LIMB_BITS);
855+
for (size_t i = limb_n - 2; i >= limb_shifts && i < limb_n; i--) {
856+
shifted_bits = static_cast<cast_t>(limbs[i - limb_shifts]) << bit_shifts;
857+
result.limbs[i] = static_cast<limb_t>(shifted_bits);
858+
result.limbs[i + 1] |= static_cast<limb_t>(shifted_bits >> LIMB_BITS);
844859
}
845860

846-
limb_t last_shifted_limb = limbs[index];
847-
last_shifted_limb <<= bit_shifts;
848-
result.limbs[index + limb_shifts] |= last_shifted_limb;
849-
861+
for (size_t i = 0; i < limb_shifts; i++) {
862+
result.limbs[i] = 0;
863+
}
864+
850865
return result;
851866
}
852867

0 commit comments

Comments
 (0)