RShift function

List<int> RShift(
  1. List<int> x,
  2. int n
)

Implementation

List<int> RShift(List<int> x, int n) {
  int bit_shift = n % 8;
  int byte_shift = n ~/ 8;

  int mask = make_rshift_mask(bit_shift);
  int overflow_mask = ~mask;

  var result = List<int>.generate(x.length, (i) => 0);
  // valtype result(x.size(), 0x00);

  for (int i = 0; i < x.length; i++) {
    int k = i + byte_shift;
    if (k < x.length) {
      int val = (x[i] & mask);
      val >>= bit_shift;
      result[k] |= val;
    }

    if (k + 1 < x.length) {
      int carryval = (x[i] & overflow_mask);
      carryval <<= 8 - bit_shift;
      result[k + 1] |= carryval;
    }
  }
  return result;
}