【发布时间】:2013-06-29 23:04:45
【问题描述】:
我正在使用 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。如果我在 Chrome 的 JavaScript 控制台中运行 (instance >> 1) ^ (-(instance & 1)),我会得到 -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;
【问题讨论】:
标签: dart dart2js zigzag-encoding