我正在使用 Dart 对 32 位整数进行ZigZag编码。这是我正在使用的源代码:
int _encodeZigZag(int instance) => (instance << 1) ^ (instance >> 31);
int _decodeZigZag(int instance) => (instance >> 1) ^ (-(instance & 1));
代码在 DartVM 中按预期工作。
但是在 dart2js 中,_decodeZigZag
如果我输入负数,该函数将返回无效结果。例如-10
. -10
被编码19
并应该被解码回-10
,但它被解码为4294967286
。如果我(instance >> 1) ^ (-(instance & 1))
在 Chrome 的 JavaScript 控制台中运行,我会得到预期的结果-10
。这对我来说意味着,Javascript 应该能够使用它的数字模型正确运行此操作。
但 Dart2Js 生成以下 JavaScript,看起来与我在控制台中测试的代码不同:
return ($.JSNumber_methods.$shr(instance, 1) ^ -(instance & 1)) >>> 0;
为什么 Dart2Js 会在函数中添加一个使用过的右移 0?如果没有转变,结果将如预期的那样。
现在我想知道,这是 Dart2Js 编译器中的错误还是预期结果?有没有办法强制 Dart2Js 输出正确的 javascript 代码?
还是我的 Dart 代码错了?
PS:还测试了将 XOR 拆分为其他操作,但 Dart2Js 仍在添加右移:
final a = -(instance & 1);
final b = (instance >> 1);
return (a & -b) | (-a & b);
结果是:
a = -(instance & 1);
b = $.JSNumber_methods.$shr(instance, 1);
return (a & -b | -a & b) >>> 0;