code: static void shiftRight(Slice decimal, int rightShifts, boolean roundUp, Slice result)
      {
          if (rightShifts == 0) {
              copyUnscaledDecimal(decimal, result);
              return;
          }
  
          int wordShifts = rightShifts / 64;
          int bitShiftsInWord = rightShifts % 64;
          int shiftRestore = 64 - bitShiftsInWord;
  
          // check round-ups before settings values to result.
          // be aware that result could be the same object as decimal.
          boolean roundCarry;
          if (bitShiftsInWord == 0) {
              roundCarry = roundUp && getLong(decimal, wordShifts - 1) < 0;
          }
          else {
              roundCarry = roundUp && (getLong(decimal, wordShifts) & (1L << (bitShiftsInWord - 1))) != 0;
          }
  
          // Store negative before settings values to result.
          boolean negative = isNegative(decimal);
  
          long low;
          long high;
  
          switch (wordShifts) {
              case 0:
                  low = getLong(decimal, 0);
                  high = getLong(decimal, 1);
                  break;
              case 1:
                  low = getLong(decimal, 1);
                  high = 0;
                  break;
              default:
                  throw new IllegalArgumentException();
          }
  
          if (bitShiftsInWord > 0) {
              low = (low >>> bitShiftsInWord) | (high << shiftRestore);
              high = (high >>> bitShiftsInWord);
          }
  
          if (roundCarry) {
              if (low != ALL_BITS_SET_64) {
                  low++;
              }
              else {
                  low = 0;
                  high++;
              }
          }
  
          pack(result, low, high, negative);
      }
docs: visible for testing