8

如何在 Dart 中执行按位无符号右移/零填充右移?

例如这样的事情:

foo >>> 2
4

3 回答 3

10

零填充右移需要特定的整数大小。由于 Dart 中的整数具有任意精度,因此 '>>> 运算符在那里没有意义。

模拟零填充右移的最简单方法是先位和数字。

例子:

(foo & 0xFFFF) >> 2 // 16 bit zero-fill shift
(foo & 0xFFFFFFFF) >> 2 // 32 bit shift.

2021 年更新:

Dart 整数现在是 64 位的。从 Dart 2.14 开始,>>>运算符移动 64 位整数并用 0 填充最高有效位。

于 2012-07-31T20:57:43.957 回答
3

从Dart 2.14 开始,现在添加了三重移位运算符,即整数的按位无符号右移。

>>>Dart 中的三重移位运算符

你可以从 Dart 版本 2.14 开始简单地使用它:

var foo = 42;
foo >>> 2;

为了默认为您的应用启用此功能,您必须在以下位置升级您的 SDK 约束pubspec.yaml

environment:
  sdk: '>=2.14.0-0 <3.0.0'

在文档中了解有关运算符的更多信息

飞镖前 2.14

如果你还没有升级到 Dart 2.14,你可以简单地使用这个函数:

/// Bitwise unsigned right shift of [x] by [s] bits.
///
/// This function works as `>>>` does starting with Dart 2.14.
int urs(int x, int s) => s <= 0 ? x : (x >> s) & (0x7fffffffffffffff >> (s - 1));

这是有效的,因为现在 Dart 中的整数总是 64 位的。

于 2021-08-01T15:59:27.583 回答
2

您可以定义一个实用函数来使用:

int zeroFillRightShift(int n, int amount) {
  return (n & 0xffffffff) >> amount;
}

假设你有 32 位无符号整数,如果你有也可以。

于 2012-11-03T15:49:22.070 回答