docs: public int normalizeMe() throws IllegalArgumentException
  	{
  		int src;
  		int wordcount = 0;
  		int bitcount = 0;
  		int v = 0;
  		for (src = nWords - 1; src >= 0 && (v = data[src]) == 0; src--)
  		{
  			wordcount += 1;
  		}
  		if (src < 0)
  		{
  			// oops. Value is zero. Cannot normalize it!
  			throw new IllegalArgumentException("zero value");
  		}
  		/*
  		 * In most cases, we assume that wordcount is zero. This only
  		 * makes sense, as we try not to maintain any high-order
  		 * words full of zeros. In fact, if there are zeros, we will
  		 * simply SHORTEN our number at this point. Watch closely...
  		 */
  		nWords -= wordcount;
  		/*
  		 * Compute how far left we have to shift v s.t. its highest-
  		 * order bit is in the right place. Then call lshiftMe to
  		 * do the work.
  		 */
  		if ((v & 0xf0000000) != 0)
  		{
  			// will have to shift up into the next word.
  			// too bad.
  			for (bitcount = 32; (v & 0xf0000000) != 0; bitcount--)
  				v >>>= 1;
  		}
  		else
  		{
  			while (v <= 0x000fffff)
  			{
  				// hack: byte-at-a-time shifting
  				v <<= 8;
  				bitcount += 8;
  			}
  			while (v <= 0x07ffffff)
  			{
  				v <<= 1;
  				bitcount += 1;
  			}
  		}
  		if (bitcount != 0)
  			lshiftMe(bitcount);
  		return bitcount;
  	}