public void ShiftLeft(int cbit) {
AssertValid();
Debug.Assert(cbit >= 0);
int idx, cu;
uint uExtra;
if (0 == cbit || 0 == length) {
return;
}
cu = cbit >> 5;
cbit &= 0x001F;
if (cbit > 0) {
idx = length - 1;
uExtra = digits[idx] >> (32 - cbit);
for ( ; ; idx--) {
digits[idx] <<= cbit;
if (0 == idx) {
break;
}
digits[idx] |= digits[idx - 1] >> (32 - cbit);
}
} else {
uExtra = 0;
}
if (cu > 0 || 0 != uExtra) {
// Make sure there's enough room.
idx = length + (0 != uExtra ? 1 : 0) + cu;
Ensure(idx);
if (cu > 0) {
for (int i = length; 0 != i--; ) {
digits[cu + i] = digits[i];
}
for (int i = 0; i < cu; i++) {
digits[i] = 0;
}
length += cu;
}
// Throw on the extra one.
if (0 != uExtra) {
digits[length++] = uExtra;
}
}
AssertValid();
}