楼上的,全世界有名的算法,价值几千亿的算法md5就要用到这些啊
上面的是这一算法的一部分不过貌似我理解错了,如果是整数,很可能是32位,根据浏览器的不同而不同吧我还要问一问,md5算法,是不是一个固定的函数,
什么样的值就会有什么样的输出,不能对这个函数做一点点的调整?

解决方案 »

  1.   

    <<和>>是位运算
    你把十进制转换成二进制就好理解了
    比如
    5二进制位
    00000101 5<<2 就表示左移2位
    变成了
    00001010就是表示十进制20同理>>就是右移
    5>>2
    变成
    00000001结果为10x80是16进制,转换成十进制是8*16=128
    %是模运算,就是取余数
      

  2.   


    var len=999.9999;
    var n=len>>5;
    document.write(n+'<br>');
    var n=0x80<<((len)%32);
    document.write(n+'<br>');
    var n=(len+64)>>>9;//  >>>应该是无符号右移,不是简单的补0概念;你可以把9换成2看看什么结果
    document.write(n+'<br>');
    结果:
    31
    16384
    2
      

  3.   

    @toury
    能详解的解释一下么?很奇怪
    len显然是浮点数,
    len+64也是浮点数
    怎么移位的时候就变成无符号了呢?真是奇怪由上面的一系列运算规则来看,应该可以得出这个结论:任何+ - * % / 只要运算数有一个是整数,那么结果就是整数这样的话len%32=70x80<<7为什么会等于16384?
      

  4.   

    js:  parseInt(0x80,10)=128
    我们来反过来推:
    16384/128=128=2的7次方2的7次方-》左移7位,也就是<<7,有什么问题吗?0x80是16进制,左移操作是转成2进制后进行的
      

  5.   

    我也忘的差不多了,而且一两句话也说不清楚。非要说的话其实就是一句:十进制/二进制浮点数的转换。因为MD5从本质上讲是以512的倍数补位进行位操作的过程,原理上就是二进制的操作,然后转换回来。你可以找写MD5原理看看。关于浮点数的疑惑,你可以参考一下这里http://www.cnblogs.com/hanxianlong/archive/2008/11/17/1335277.html。另外我上面的例子仅仅是说明“>>>”不能单纯叫高位补0,对无符号来说是对的,但对有符号来说就不确切了,因为它也要补1,呵呵
      

  6.   

    唉呀,加少了toury一直以为toury和cutBug是一个人呢,呵呵,不好意思
    有机会再请教二位