【问题标题】:What is >>> 0 in javascript?javascript中的>>> 0是什么?
【发布时间】:2015-06-02 17:01:35
【问题描述】:

我在 github 上使用 seikichi 的名为 tiff.js 的 LibTIFF C 代码的编译 Emscripten 端口。在我的代码中,我需要获取一些 TIFF 标签。在 tiff.js 中,您可以调用 tiff.getField(tag value)。我特别需要的一个标签是 ROWSPERSTRIP,它是 278,所以为了得到这个标签,我调用如下:

var rps = tiff.getField(278); //return rows per strip tiff tag

这似乎适用于一些较小的值 1 到 176(还不完全确定?),但我有几个文件,AsTiffTagViewer 报告为每个条带 224 行,一个文件每个条带 746 行。但是 tiff.js 将这两个值分别错误地报告为 6 和 1。我正在单步调试 tiff.js 中的调试器,并注意到它出现了以下代码:

do{if(b>>>0<=65535){d=e[j+24>>1]|0;if((1<<(d&31)&c[a+40+(d>>>5<<2)>>2)]|0)==0){k=0}else{break}i=f;return k|0}}while(0);

我怀疑它很难看,因为它是 Emscripten 可以用 C 代码做的最好的。现在我知道“>>”和“>”的信息。我还不知道这是否是 tiff.js 中导致 tiff.getField(278) 不正确地返回每个条带值的较大行的代码部分(我现在所知道的是它看起来每个条带较小的行带值正确返回,而较大的值未正确返回。

所以我的主要问题是“>>>”是什么,我的第二个问题是有没有人知道为什么 tiff.getField(278) 对于较大的值可能无法正常工作。注意:大多数其他基本 TIFF 标签确实返回正确的值,例如 tiff.getField(PHOTOMETRIC) 和 tiff.getField(SAMPLESPERPIXLE)...等。

提前感谢您的想法

【问题讨论】:

  • 无符号右移运算符。

标签: javascript tiff libtiff


【解决方案1】:

这是一个按位零填充右移,来自MDN

此运算符将第一个操作数移动指定的位数 正确的。右移的多余位被丢弃。零 位从左侧移入。符号位变为 0,所以 结果总是非负数。

对于非负数,零填充右移和符号传播 右移产生相同的结果。例如,9 >>> 2 产生 2,则 同 9 >> 2:

至于为什么当你调用tiff.getField(278)tiff.js 不起作用,我不知道,我认为它应该,并且在 Github 页面上似乎没有任何已知问题,但是你可以尝试添加一个问题,看看开发者是否知道。

【讨论】:

    【解决方案2】:

    -3 &gt;&gt;&gt; 0 是无符号右移 0 位。 IE。数字转换为 无符号 32 位 整数,而不是 -3 | 0 将数字转换为 32 位有符号整数。

    -3 >>> 0 === 4294967293
    -3 | 0 === -3
    

    11.7.3 The Unsigned Right Shift Operator ( >>> )

    对左操作数按右操作数指定的量执行零填充按位右移操作。

    产生式ShiftExpression : ShiftExpression &gt;&gt;&gt; AdditiveExpression 评估如下:

    1. lref 成为评估ShiftExpression 的结果。

    2. lval 成为GetValue(lref)

    3. rref 成为评估AdditiveExpression 的结果。

    4. rvalGetValue(rref)

    5. lnumToUint32(lval)。

    6. rnumToUint32(rval)

    7. shiftCount 成为屏蔽除rnum 的最低有效5 位之外的所有结果,即计算rnum &amp; 0x1F

    8. 返回将lnum 零填充右移shiftCount 位的结果。空出的位用零填充。 结果是一个无符号的 32 位整数。

    【讨论】:

    • 我不认为你可以调用位移 unsigned 本身。移位会影响符号位,但它本质上不是 unsigned
    • -3 &gt;&gt;&gt; 0 被称为无符号移位,因为该数字像一个无符号的 32 位数字一样被线程化。 -3 &gt;&gt; 0 是有符号移位(算术移位),因为它扩展了左操作数的符号。我猜 Emscripten 使用 &gt;&gt; 0 而不是 | 0 因为它短了一个字节。
    • 看来两者都用了:c[a+40+(d&gt;&gt;&gt;5&lt;&lt;2)&gt;&gt;2)]|0
    • @Bonsaigin,是的,因为有些变量是有符号的,有些是无符号的。我只是说 Emscripten 不使用 X &gt;&gt; 0
    • 感谢所有关于">>>"的信息我应该能够找到那个信息不知道为什么我不能?有趣的是,如果你用谷歌搜索>>>“我似乎什么也没得到?我已经联系了 seikichi,了解为什么 tiff.js 在大于某个值 n 时没有为 tiff.getField(278) 提供正确的值。我一直在将结果与 AsTiffTagViewer 进行比较,对于更大的值,tiff.js 会得出错误的值?
    猜你喜欢
    • 2018-01-06
    • 2015-12-06
    • 1970-01-01
    • 2017-10-05
    • 2016-01-26
    • 1970-01-01
    • 2016-12-03
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多