什么是>>>在javascript中为0?

时间:2015-06-02 17:01:35

标签: javascript tiff libtiff

我在github上使用seikichi的一个名为tiff.js的LibTIFF C代码的编译Emscripten端口。在我的代码中,我需要获得一些TIFF标签。在tiff.js中,您可以调用tiff.getField(标记值)。我需要的一个标签是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代码。现在我知道“&gt;&gt;”和“&lt;&lt;”但我似乎找不到任何关于“&gt;&gt;&gt;”的内容。我还没有任何想法,如果这是tiff.js中的代码部分导致tiff.getField(278)不能错误地返回每个条带值的一些较大的行(我现在所知道的是它看起来更小的行数条带值会正确返回,而较大的条带值未正确返回它会出现。

所以我的主要问题是什么是“&gt;&gt;&gt;”我的第二个问题是,是否有人对tiff.getField(278)可能无法正确处理较大值的原因有任何想法。注意:大多数其他基本TIFF标签确实返回正确的值,如tiff.getField(PHOTOMETRIC)和tiff.getField(SAMPLESPERPIXLE)......等。

提前感谢您的想法

2 个答案:

答案 0 :(得分:6)

这是MDN

的按位零填充右移
  

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

     

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

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

答案 1 :(得分:2)

-3 >>> 0是一个无符号右移0位。即该数字将转换为无符号32位整数,而不是-3 | 0,将数字转换为32位有符号整数。

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

11.7.3 The Unsigned Right Shift Operator ( >>> )

     

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

     

生产ShiftExpression : ShiftExpression >>> AdditiveExpression的评估如下:

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

  2.   
  3. lval成为GetValue(lref)

  4.   
  5. rref成为评估AdditiveExpression的结果。

  6.   
  7. rval成为GetValue(rref)

  8.   
  9. lnumToUint32(lval)。

  10.   
  11. rnum成为ToUint32(rval)

  12.   
  13. shiftCount成为屏蔽除rnum的最低5位之外的所有内容的结果,即计算rnum & 0x1F

  14.   
  15. 返回lnumshiftCount执行零填充右移的结果。空位用零填充。 结果是无符号的32位整数。

  16.