//虽然这个代码有很多地方都没有看懂 但是我这里只希望先理解两个问题
//下面问题一和问题二告诉我就可以了 

private long[] count = new long[2];

private void md5Update(byte[] inbuf, int inputLen) {
//inbuf是一个字符串,inputLen是这个字符串的长度
//比如String类型的"student" inbuf是student的type数组表示形式,inputlen是"student"的长度7

        int i, index, partLen;
        byte[] block = new byte[64];
        index = (int) (count[0] >>> 3) & 0x3F;
/*问题一:    请问这两句下来 最后这个index的值是多少啊
             0x3f是一个16进制的数    那么这个数应该是78吧
             那么这个count[0]>>>3这是一个二进制的数吧 它怎么可以跟一个16进制的数进行按位与运算的呢 
             它是先吧这个16进制的数 先转换成二进制的数  然后再进行按位与的运算的吗?
        // /* Update number of bits */
        if ((count[0] += (inputLen << 3)) < (inputLen << 3))
            count[1]++;

//问题二:    请问为什么要这样判断一下呢 ,我的逻辑思维实在有点乱套,请高手解答
        count[1] += (inputLen >>> 29);

        partLen = 64 - index;

        // Transform as many times as possible.
        if (inputLen >= partLen) {
            md5Memcpy(buffer, inbuf, index, 0, partLen);
            md5Transform(buffer);

            for (i = partLen; i + 63 < inputLen; i += 64) {

                md5Memcpy(block, inbuf, 0, i, 64);
                md5Transform(block);
            }
            index = 0;

        } else

            i = 0;

        // /* Buffer remaining input */
        md5Memcpy(buffer, inbuf, index, i, inputLen - i);

    }