18
18
#include " arith_tools.h"
19
19
20
20
21
- typedef BigInt::ullong_t ullong_t ;
21
+ typedef BigInt::ullong_t ullong_t ; // NOLINT(readability/identifiers)
22
+ typedef BigInt::llong_t llong_t ; // NOLINT(readability/identifiers)
22
23
23
24
/* ******************************************************************\
24
25
@@ -432,8 +433,12 @@ mp_integer arith_left_shift(
432
433
if (shift>true_size && a!=mp_integer (0 ))
433
434
throw " shift value out of range" ;
434
435
435
- ullong_t result=a.to_ulong ()<<shift;
436
- return result;
436
+ llong_t result=a.to_long ()<<shift;
437
+ llong_t mask=
438
+ true_size<(sizeof (llong_t )*8 ) ?
439
+ (1L <<true_size)-1 :
440
+ -1 ;
441
+ return result&mask;
437
442
}
438
443
439
444
/* ******************************************************************\
@@ -456,14 +461,14 @@ mp_integer arith_right_shift(
456
461
const mp_integer &b,
457
462
std::size_t true_size)
458
463
{
459
- ullong_t number=a.to_ulong ();
464
+ llong_t number=a.to_long ();
460
465
ullong_t shift=b.to_ulong ();
461
466
if (shift>true_size)
462
467
throw " shift value out of range" ;
463
468
464
- ullong_t sign=(1 <<(true_size-1 ))&number;
465
- ullong_t pad=(sign==0 ) ? 0 : ~((1 <<(true_size-shift))-1 );
466
- ullong_t result=(number>> shift)|pad;
469
+ llong_t sign=(1 <<(true_size-1 ))&number;
470
+ llong_t pad=(sign==0 ) ? 0 : ~((1 <<(true_size-shift))-1 );
471
+ llong_t result=(number >> shift)|pad;
467
472
return result;
468
473
}
469
474
@@ -490,8 +495,17 @@ mp_integer logic_left_shift(
490
495
ullong_t shift=b.to_ulong ();
491
496
if (shift>true_size && a!=mp_integer (0 ))
492
497
throw " shift value out of range" ;
493
-
494
- ullong_t result=a.to_ulong ()<<shift;
498
+ llong_t result=a.to_long ()<<shift;
499
+ if (true_size<(sizeof (llong_t )*8 ))
500
+ {
501
+ llong_t sign=(1L <<(true_size-1 ))&result;
502
+ llong_t mask=(1L <<true_size)-1 ;
503
+ // Sign-fill out-of-range bits:
504
+ if (sign==0 )
505
+ result&=mask;
506
+ else
507
+ result|=~mask;
508
+ }
495
509
return result;
496
510
}
497
511
@@ -519,7 +533,7 @@ mp_integer logic_right_shift(
519
533
if (shift>true_size)
520
534
throw " shift value out of range" ;
521
535
522
- ullong_t result=a. to_ulong ()>> shift;
536
+ ullong_t result=(( ullong_t )a. to_long ()) >> shift;
523
537
return result;
524
538
}
525
539
@@ -550,7 +564,7 @@ mp_integer rotate_right(
550
564
551
565
ullong_t revShift=true_size-shift;
552
566
ullong_t filter=1 <<(true_size-1 );
553
- ullong_t result=(number>> shift)|((number<<revShift)&filter);
567
+ ullong_t result=(number >> shift)|((number<<revShift)&filter);
554
568
return result;
555
569
}
556
570
@@ -581,6 +595,6 @@ mp_integer rotate_left(
581
595
582
596
ullong_t revShift=true_size-shift;
583
597
ullong_t filter=1 <<(true_size-1 );
584
- ullong_t result=((number<<shift)&filter)|((number&filter)>> revShift);
598
+ ullong_t result=((number<<shift)&filter)|((number&filter) >> revShift);
585
599
return result;
586
600
}
0 commit comments