请教一个 关于移位<<的问题

Kuntakimp 2008-12-23 11:16:41
javascript当中的数都是当作64-bit浮点数来看的
如下有一个函数:

function ntes_core_md5(x,len){

function ntes_core_md5(x,len){

x[len>>5]|=0x80<<((len)%32);

x[(((len+64)>>>9)<<4)+14]=len;
.......

}

在实际调用的时候,len是50

那么
如果len是用浮点数的形式来表示
len>>5是多少呢
0x<<((len)%32又是多少呢

>>>表示高位补零
那么(len+64)>>>9又是多少呢

我的理解有错吗?
感觉不应该当浮点数来看
如果不当的话,那么当作几-bit的数来看呢?
...全文
126 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
toury 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 CutBug 的回复:]
js:  parseInt(0x80,10)=128
我们来反过来推:
16384/128=128=2的7次方

2的7次方-》左移7位,也就是 < <7,有什么问题吗?

0x80是16进制,左移操作是转成2进制后进行的

[/Quote]
没错,正是如此。位移本身就是二进制移动后补0补一的过程
toury 2008-12-25
  • 打赏
  • 举报
回复
我也忘的差不多了,而且一两句话也说不清楚。非要说的话其实就是一句:十进制/二进制浮点数的转换。因为MD5从本质上讲是以512的倍数补位进行位操作的过程,原理上就是二进制的操作,然后转换回来。你可以找写MD5原理看看。

关于浮点数的疑惑,你可以参考一下这里http://www.cnblogs.com/hanxianlong/archive/2008/11/17/1335277.html

另外我上面的例子仅仅是说明“>>>”不能单纯叫高位补0,对无符号来说是对的,但对有符号来说就不确切了,因为它也要补1,呵呵
CutBug 2008-12-25
  • 打赏
  • 举报
回复
js: parseInt(0x80,10)=128
我们来反过来推:
16384/128=128=2的7次方

2的7次方-》左移7位,也就是<<7,有什么问题吗?

0x80是16进制,左移操作是转成2进制后进行的
Kuntakimp 2008-12-25
  • 打赏
  • 举报
回复
@toury
能详解的解释一下么?

很奇怪
len显然是浮点数,
len+64也是浮点数
怎么移位的时候就变成无符号了呢?真是奇怪

由上面的一系列运算规则来看,应该可以得出这个结论:任何+ - * % / 只要运算数有一个是整数,那么结果就是整数

这样的话len%32=7

0x80<<7为什么会等于16384?


Kuntakimp 2008-12-25
  • 打赏
  • 举报
回复
谢谢谢谢
CutBug 2008-12-25
  • 打赏
  • 举报
回复
赞一个:)
toury 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Kuntakimp 的回复:]
唉呀,加少了toury

一直以为toury和cutBug是一个人呢,呵呵,不好意思
有机会再请教二位
[/Quote]

没关系兄弟,解决了问题就好,分不分的没什么所谓:)
Kuntakimp 2008-12-25
  • 打赏
  • 举报
回复
唉呀,加少了toury

一直以为toury和cutBug是一个人呢,呵呵,不好意思
有机会再请教二位
Kuntakimp 2008-12-25
  • 打赏
  • 举报
回复
对,没错
CutBug说得对
cloudgamer 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Kuntakimp 的回复:]
楼上的,全世界有名的算法,价值几千亿的算法md5就要用到这些啊
上面的是这一算法的一部分

不过貌似我理解错了,如果是整数,很可能是32位,根据浏览器的不同而不同吧

我还要问一问,md5算法,是不是一个固定的函数,
什么样的值就会有什么样的输出,不能对这个函数做一点点的调整?
[/Quote]

我知道有这个东西
但我确实没在实际应用中使用过
toury 2008-12-24
  • 打赏
  • 举报
回复

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
不悲不喜 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Kuntakimp 的回复:]
3楼的朋友,我懂这些

其实移位与数字的储存方式有关,比如说16位,32位的方式,对同一个移位操作,结果是不同的
[/Quote]

如果是整数运算的话,只有溢出的情况下才和存储方式有关系。
浮点数的运算的话,则肯定都浮点有关系了。
不过我没见过浮点数用位移来计算的。

CutBug 2008-12-24
  • 打赏
  • 举报
回复
这些要翻一翻计算机组成原理):
Kuntakimp 2008-12-24
  • 打赏
  • 举报
回复
3楼的朋友,我懂这些

其实移位与数字的储存方式有关,比如说16位,32位的方式,对同一个移位操作,结果是不同的
CutBug 2008-12-24
  • 打赏
  • 举报
回复
<<和>>是位运算
你把十进制转换成二进制就好理解了
比如
5二进制位
00000101

5<<2 就表示左移2位
变成了
00001010就是表示十进制20

同理>>就是右移
5>>2
变成
00000001结果为1

0x80是16进制,转换成十进制是8*16=128
%是模运算,就是取余数
Kuntakimp 2008-12-23
  • 打赏
  • 举报
回复
楼上的,全世界有名的算法,价值几千亿的算法md5就要用到这些啊
上面的是这一算法的一部分

不过貌似我理解错了,如果是整数,很可能是32位,根据浏览器的不同而不同吧

我还要问一问,md5算法,是不是一个固定的函数,
什么样的值就会有什么样的输出,不能对这个函数做一点点的调整?
cloudgamer 2008-12-23
  • 打赏
  • 举报
回复
这个还真的不怎么用
记得用来做乘法运算效率很高

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧