如何在Dart中进行无符号位(零填充)右移操作?

9

我该如何在Dart中执行无符号右移位操作 / 零填充右移操作?

例如,像这样的操作:

foo >>> 2
3个回答

12

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

模拟零填充右移的最简单方法是先对数字进行按位与操作。

示例:

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

2021年更新:

Dart整数现在是64位的。自Dart 2.14版本以来,>>>操作符会将64位整数向右移动,并用0填充最高位。


1
七年后,Dart整数变成了64位,并且他们正在处理此问题。https://github.com/dart-lang/language/issues/120 - Ryan Haining
这已经作为Dart的本地特性添加了进去,详见我的回答 - creativecreatorormaybenot

5

三重位移运算符,也就是整数的无符号按位右移,在Dart 2.14中已添加。

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

从Dart 2.14开始,您可以简单地使用此功能

var foo = 42;
foo >>> 2;

为了使此功能默认启用您的应用程序,您必须升级pubspec.yaml中的SDK约束:
environment:
  sdk: '>=2.14.0-0 <3.0.0'

请阅读文档以了解运算符的更多信息

Dart 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位。


“Pre Dart 2.14”(以及Dart 2.0之后)变体不起作用。在64位整数上执行& 0xffffffffffffffff是无操作的。 不幸的是,你需要更复杂的东西。也许像这样的东西:int urs(int x, int s) => s <= 0 ? x : (x >> s) & (0x7fffffffffffffff >> (s - 1)); - lrn
@lrn 我知道了 - 我现在已经更新了它,使用了你的建议。一旦Dart 2.14稳定版发布,我将删除该部分。 - creativecreatorormaybenot

2
您可以定义一个实用函数来使用:
int zeroFillRightShift(int n, int amount) {
  return (n & 0xffffffff) >> amount;
}

假设您拥有32位无符号整数,如果确实如此,则可以使用该方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接