@@ -612,47 +612,34 @@ size_t intn_bsl(const uint32_t num[], size_t len, size_t n, uint32_t *out)
612
612
return initial_zeros + i ;
613
613
}
614
614
615
- size_t bsru (const uint32_t num [], size_t effective_bits_len , size_t n , uint32_t last_digit , uint32_t * out )
615
+ void bsru (const uint32_t num [], size_t effective_bits_len , size_t n , uint32_t last_digit , uint32_t * out )
616
616
{
617
- size_t digit_bit_size = sizeof (uint32_t ) * 8 ;
618
-
619
- size_t digit_right_bit_shift = n % 32 ;
620
- size_t left_shift_n = (32 - digit_right_bit_shift );
621
-
622
- size_t len = size_round_to (effective_bits_len , digit_bit_size ) / digit_bit_size ;
623
- size_t counted_digits = len ;
617
+ size_t digit_bit_size = sizeof (uint32_t ) * 8 ; // 32
624
618
625
- ///size_t new_bits_len = size_round_to(effective_bits_len - n, digit_bit_size);
619
+ size_t digit_right_bit_shift = n % digit_bit_size ;
620
+ size_t left_shift_n = (digit_bit_size - digit_right_bit_shift );
626
621
627
- //// size_t new_digits_count = new_bits_len / digit_bit_size;
622
+ size_t len_in_digits = size_round_to ( effective_bits_len , digit_bit_size ) / digit_bit_size ;
628
623
629
- size_t discarded = MIN (n / digit_bit_size , len );
624
+ // caller makes sure that discarded < len_in_digits
625
+ size_t discarded = n / digit_bit_size ;
630
626
631
627
if (left_shift_n == 32 ) {
632
- memcpy (out , num + discarded , (len - discarded ) * sizeof (uint32_t ));
633
- return len - discarded ;
628
+ memcpy (out , num + discarded , (len_in_digits - discarded ) * sizeof (uint32_t ));
629
+ return ;
634
630
}
635
631
636
632
size_t i ;
637
- for (i = discarded ; i < counted_digits - 1 ; i ++ ) {
633
+ for (i = discarded ; i < len_in_digits - 1 ; i ++ ) {
638
634
uint32_t next_digit = num [i + 1 ];
639
635
uint32_t digit = num [i ];
640
636
out [i - discarded ] = (digit >> digit_right_bit_shift ) | (next_digit << left_shift_n );
641
637
}
642
638
uint32_t maybe_last_out = (num [i ] >> digit_right_bit_shift ) | (last_digit << left_shift_n );
643
639
644
- /*
645
- if (initial_zeros + i > new_digits_count) {
646
- abort();
647
- }
648
- */
649
-
650
640
if (maybe_last_out ) {
651
641
out [i - discarded ] = maybe_last_out ;
652
- return i - discarded + 1 ;
653
642
}
654
-
655
- return i - discarded ;
656
643
}
657
644
658
645
size_t intn_bsr (const uint32_t num [], size_t len , intn_integer_sign_t num_sign , size_t n , uint32_t * out )
@@ -662,29 +649,25 @@ size_t intn_bsr(const uint32_t num[], size_t len, intn_integer_sign_t num_sign,
662
649
size_t ms_digit_bits = 32 - uint32_nlz (num [counted_digits - 1 ]);
663
650
size_t effective_bits_len = (counted_digits - 1 ) * digit_bit_size + ms_digit_bits ;
664
651
665
- if (n > effective_bits_len ) {
652
+ if (n >= effective_bits_len ) {
666
653
out [0 ] = (num_sign == IntNPositiveInteger ) ? 0 : 1 ;
667
654
return 1 ;
668
655
}
669
656
657
+ size_t shifted_len = size_round_to (effective_bits_len - n , digit_bit_size ) / digit_bit_size ;
658
+
670
659
if (num_sign == IntNPositiveInteger ) {
671
- return bsru (num , effective_bits_len , n , 0 , out );
660
+ bsru (num , effective_bits_len , n , 0 , out );
661
+
672
662
} else {
673
663
uint32_t tmp_buf [INTN_MAX_RES_LEN ];
674
- memset (out , 0 , INTN_MAX_RES_LEN * sizeof (const uint32_t ));
675
664
neg (num , counted_digits , tmp_buf );
676
- size_t shifted_len = bsru (tmp_buf , effective_bits_len , n , (uint32_t ) -1 , out );
677
-
678
- size_t len = size_round_to (effective_bits_len - n , digit_bit_size ) / digit_bit_size ;
679
- neg_in_place (out , len );
680
-
681
- fprintf (stderr , "shifted: %i, len: %i\n" , (int ) shifted_len , (int ) len );
682
- print_num (out , len );
683
- return len ;
665
+ bsru (tmp_buf , effective_bits_len , n , (uint32_t ) -1 , out );
666
+ neg_in_place (out , shifted_len );
684
667
}
685
- }
686
-
687
668
669
+ return shifted_len ;
670
+ }
688
671
689
672
/*
690
673
uint32_t last_digit = 0;
0 commit comments