private void writeNumber(OutputStream out, int d, int w) {
   int q, n;
   switch (w) {
     case 4:
       writeDigit(out, q = d / 1000);
       d -= (q << 10) - (q << 4) - (q << 3); // d -= q * 1000
     case 3:
       writeDigit(out, q = d / 100);
       d -= (q << 7) + (q << 2) - (q << 5); // d -= q * 100
     case 2:
       writeDigit(out, q = d / 10);
       d -= (q << 3) + (q << 1); // d -= q * 10
     case 1:
       writeDigit(out, d);
       break;
     default:
       n = 10000;
       w -= 4;
       while (--w > 0) n = (n << 3) + (n << 1); // n *= 10
       while (n > 1) {
         writeDigit(out, q = d / n);
         d -= q * n;
         n /= 10;
       }
       writeDigit(out, d);
   }
 }