// ============================================================ // // shift.cpp // // Copyright 2002, Dennis Meilicke and Rene Peralta // // ============================================================ // // Description: // // Function for bit shifting a number. // // ============================================================ #include #include void ShiftRightEqual( Base *Operand, size_t distance ) // // Shift 'distance' bits to the right, in place. // { if( ( distance == 0 ) || ( Operand->size == 0 ) ) return; size_t d1 = distance % digitSizeInBits; size_t d2 = digitSizeInBits - d1; size_t digitDiff = distance / digitSizeInBits; digit_t *dest = Operand->digit; digit_t *source = dest + digitDiff; digit_t *end = dest + Operand->size; *end = 0; for( ; source < end ; source++, dest++ ) if( d1 ) *dest = ( ( *source ) >> d1 ) | ( ( *(source + 1) ) << d2 ) ; else *dest = *source; if( Operand->size > digitDiff ) Operand->size -= digitDiff; else Operand->size = 0; // // We may have shifted so that the leading digit is zero... // if( Operand->size ) if( Operand->digit[ Operand->size - 1 ] == 0 ) Operand->size--; return; } // ============================================================ void ShiftLeftEqual( Base *Operand, size_t distance ) // // Shift 'distance' bits to the right, in place. // { if( ( distance == 0 ) || ( Operand->size == 0 ) ) return; size_t d1 = distance % digitSizeInBits; size_t d2 = digitSizeInBits - d1; size_t digitDiff = distance / digitSizeInBits; digit_t *source = Operand->digit + Operand->size - 1; digit_t *dest = source + digitDiff; if( d1 ) { *(dest + 1) = ( *source ) >> d2; for( ; source>Operand->digit ; source--, dest-- ) { *dest = ( ( *source ) << d1 ) | ( *( source - 1 ) >> d2 ); } *dest = ( ( *source ) << d1 ); for( dest-- ; dest>=Operand->digit ; dest-- ) *dest = 0; } else { for( ; source>=Operand->digit ; source--, dest-- ) *dest = *source; for( ; dest>=Operand->digit ; dest-- ) *dest = 0; } Operand->size += digitDiff; if( d1 ) Operand->size++; // // If we extended the LargeNumber, we may have extended it // with zero (unset) bits. If this is the case, decrement // the index. // if( Operand->digit[ Operand->size - 1 ] == 0 ) Operand->size--; }