/// <summary>
        /// Returns this GF2Polynomial shift-left by <c>K</c> in a new GF2Polynomial
        /// </summary>
        /// 
        /// <param name="K">The shift value</param>
        /// 
        /// <returns>Returns a new GF2Polynomial (this &lt;&lt; <c>K</c>)</returns>
        public GF2Polynomial ShiftLeft(int K)
        {
            // Variant 2, requiring a modified shiftBlocksLeft(k)
            // In case of modification, consider a rename to DoShiftBlocksLeft()
            // with an explicit note that this method assumes that the polynomial
            // has already been resized. Or consider doing things inline.
            // Construct the resulting polynomial of appropriate length:
            GF2Polynomial result = new GF2Polynomial(_length + K, _value);
            // Shift left as many multiples of the block size as possible:
            if (K >= 32)
                result.DoShiftBlocksLeft(IntUtils.URShift(K, 5));

            // Shift left by the remaining (<32) amount:
            int remaining = K & 0x1f;
            if (remaining != 0)
            {
                for (int i = result._blocks - 1; i >= 1; i--)
                {
                    result._value[i] <<= remaining;
                    result._value[i] |= IntUtils.URShift(result._value[i - 1], (32 - remaining));
                }
                result._value[0] <<= remaining;
            }

            return result;
        }