我该如何在Dart中执行无符号右移位操作 / 零填充右移操作?
例如,像这样的操作:
foo >>> 2
我该如何在Dart中执行无符号右移位操作 / 零填充右移操作?
例如,像这样的操作:
foo >>> 2
在Dart中,零填充右移需要特定的整数大小。由于Dart中的整数具有任意精度,因此'>>>'运算符在其中是没有意义的。
模拟零填充右移的最简单方法是先对数字进行按位与操作。
示例:
(foo & 0xFFFF) >> 2 // 16 bit zero-fill shift
(foo & 0xFFFFFFFF) >> 2 // 32 bit shift.
Dart整数现在是64位的。自Dart 2.14版本以来,>>>
操作符会将64位整数向右移动,并用0填充最高位。
三重位移运算符,也就是整数的无符号按位右移,在Dart 2.14中已添加。
>>>
运算符从Dart 2.14开始,您可以简单地使用此功能:
var foo = 42;
foo >>> 2;
pubspec.yaml
中的SDK约束:environment:
sdk: '>=2.14.0-0 <3.0.0'
如果您还没有升级到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位。
& 0xffffffffffffffff
是无操作的。
不幸的是,你需要更复杂的东西。也许像这样的东西:int urs(int x, int s) => s <= 0 ? x : (x >> s) & (0x7fffffffffffffff >> (s - 1));
。 - lrnint zeroFillRightShift(int n, int amount) {
return (n & 0xffffffff) >> amount;
}