Function shiftRight [src]

r = a >> shift r and a may alias. Asserts there is enough memory to fit the result. The upper bound Limb count is a.limbs.len - (shift / (@sizeOf(Limb) * 8)).

Prototype

pub fn shiftRight(r: *Mutable, a: Const, shift: usize) void

Parameters

r: *Mutablea: Constshift: usize

Source

pub fn shiftRight(r: *Mutable, a: Const, shift: usize) void { const full_limbs_shifted_out = shift / limb_bits; const remaining_bits_shifted_out = shift % limb_bits; if (a.limbs.len <= full_limbs_shifted_out) { // Shifting negative numbers converges to -1 instead of 0 if (a.positive) { r.len = 1; r.positive = true; r.limbs[0] = 0; } else { r.len = 1; r.positive = false; r.limbs[0] = 1; } return; } const nonzero_negative_shiftout = if (a.positive) false else nonzero: { for (a.limbs[0..full_limbs_shifted_out]) |x| { if (x != 0) break :nonzero true; } if (remaining_bits_shifted_out == 0) break :nonzero false; const not_covered: Log2Limb = @intCast(limb_bits - remaining_bits_shifted_out); break :nonzero a.limbs[full_limbs_shifted_out] << not_covered != 0; }; llshr(r.limbs, a.limbs, shift); r.len = a.limbs.len - full_limbs_shifted_out; r.positive = a.positive; if (nonzero_negative_shiftout) r.addScalar(r.toConst(), -1); r.normalize(r.len); }