@@ -817,36 +817,51 @@ namespace epi {
817
817
818
818
// shift operators : start
819
819
820
+ // / code improved/refactored times: 1x
820
821
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 ;
822
841
}
823
842
843
+ // / code improved/refactored times: 1x
824
844
constexpr whole_number operator <<(size_t lshift) const noexcept {
825
845
whole_number result;
826
846
827
847
size_t lshift_internal = lshift % bits_n;
828
848
size_t limb_shifts = lshift_internal / LIMB_BITS;
829
849
size_t bit_shifts = lshift_internal % LIMB_BITS;
830
- size_t index = 0 ;
831
850
832
- cast_t shifted_index = 0 ;
851
+ cast_t shifted_bits = 0 ;
833
852
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;
839
854
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);
844
859
}
845
860
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
+
850
865
return result;
851
866
}
852
867
0 commit comments