@@ -485,6 +485,73 @@ size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_si
485
485
return count ;
486
486
}
487
487
488
+ static inline intn_digit_t digit_band (intn_digit_t a , intn_digit_t b )
489
+ {
490
+ return a & b ;
491
+ }
492
+
493
+ size_t intn_bandmn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
494
+ const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t out [],
495
+ intn_integer_sign_t * out_sign )
496
+ {
497
+ intn_digit_t working_buf [INTN_MAX_IN_LEN ];
498
+
499
+ const intn_digit_t * b ;
500
+ size_t b_len ;
501
+ intn_integer_sign_t b_sign ;
502
+
503
+ size_t count
504
+ = prepare_working_buf (m , m_len , m_sign , n , n_len , n_sign , & b , & b_len , & b_sign , working_buf );
505
+
506
+ signed_bitwise (b , b_len , b_sign , working_buf , count , digit_bor );
507
+ intn_integer_sign_t res_sign = sign_bitwise (m_sign , n_sign , digit_band );
508
+
509
+ cond_neg (res_sign , working_buf , count , out );
510
+ * out_sign = res_sign ;
511
+
512
+ return count ;
513
+ }
514
+
515
+ static inline intn_digit_t digit_bxor (intn_digit_t a , intn_digit_t b )
516
+ {
517
+ return a ^ b ;
518
+ }
519
+
520
+ size_t intn_bxormn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
521
+ const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t out [],
522
+ intn_integer_sign_t * out_sign )
523
+ {
524
+ intn_digit_t working_buf [INTN_MAX_IN_LEN ];
525
+
526
+ const intn_digit_t * b ;
527
+ size_t b_len ;
528
+ intn_integer_sign_t b_sign ;
529
+
530
+ size_t count
531
+ = prepare_working_buf (m , m_len , m_sign , n , n_len , n_sign , & b , & b_len , & b_sign , working_buf );
532
+
533
+ signed_bitwise (b , b_len , b_sign , working_buf , count , digit_bor );
534
+ intn_integer_sign_t res_sign = sign_bitwise (m_sign , n_sign , digit_bxor );
535
+
536
+ cond_neg (res_sign , working_buf , count , out );
537
+ * out_sign = res_sign ;
538
+
539
+ if (res_sign == IntNNegativeInteger ) {
540
+ bool all_zeros = true;
541
+ for (size_t i = 0 ; i < count ; i ++ ) {
542
+ if (out [i ] != 0 ) {
543
+ all_zeros = false;
544
+ break ;
545
+ }
546
+ }
547
+ if (all_zeros ) {
548
+ * out_sign = IntNPositiveInteger ;
549
+ }
550
+ }
551
+
552
+ return count ;
553
+ }
554
+
488
555
size_t intn_count_digits (const intn_digit_t * num , size_t num_len )
489
556
{
490
557
int i ;
0 commit comments