Dart/Flutter 移位运算符返回不同的值
Dart/Flutter bitwise shift operator returning different values
与 mobile/desktop 相比,Dart/Flutter 中的移位运算符在 Web 中返回不同的值。
运行以下代码:
var checksum = 1150946793;
var shift = checksum << 5;
print(shift);
//Returns the following values
Mobile/Desktop = 36830297376
Web = 2470559008
我应该为网络做些什么?
Dart 将整数存储为带符号的 64 位值,使它们的可能范围为 −(2^63)
到 2^63 − 1
。当超过整数的最大值时,会发生回绕并丢失最高有效位。
然而,使用 JavaScript 位运算符 truncate their operands to 32-bit integers。这意味着您看到的回绕值 (4294967296) 比在台式机或移动设备上看到的要低得多。这就是您的数字计算方式不同的原因。
docs for int 有一个注释涵盖了这一点。
为了扩展 Stephen 的回答(解决了原因),一个解决方案是使用标准数学运算符,因为它们不会被截断为 32 位:
var checksum = 1150946793;
var shift = checksum * pow(2, 5).toInt();
print(shift);
我很确定这比使用按位运算要慢几个数量级,因此仅在绝对需要处理 64 位值的情况下才使用它可能是明智的(就像我使用 µs-precision 时间戳)。
与 mobile/desktop 相比,Dart/Flutter 中的移位运算符在 Web 中返回不同的值。
运行以下代码:
var checksum = 1150946793;
var shift = checksum << 5;
print(shift);
//Returns the following values
Mobile/Desktop = 36830297376
Web = 2470559008
我应该为网络做些什么?
Dart 将整数存储为带符号的 64 位值,使它们的可能范围为 −(2^63)
到 2^63 − 1
。当超过整数的最大值时,会发生回绕并丢失最高有效位。
然而,使用 JavaScript 位运算符 truncate their operands to 32-bit integers。这意味着您看到的回绕值 (4294967296) 比在台式机或移动设备上看到的要低得多。这就是您的数字计算方式不同的原因。
docs for int 有一个注释涵盖了这一点。
为了扩展 Stephen 的回答(解决了原因),一个解决方案是使用标准数学运算符,因为它们不会被截断为 32 位:
var checksum = 1150946793;
var shift = checksum * pow(2, 5).toInt();
print(shift);
我很确定这比使用按位运算要慢几个数量级,因此仅在绝对需要处理 64 位值的情况下才使用它可能是明智的(就像我使用 µs-precision 时间戳)。