使用 R,如何对有符号(负)整数进行位移?

Using R, how to do bitwise shifting for signed (negative) integers?

在c语法中,我们可以移位有符号整数(负数):如果我们想强制和无符号整数移位,我们可以使用“>>>”。

y = -1732584194
(y>>16)

-26438

x = 1732584193
(x>>16)

26437

使用R,有按位运算符https://stat.ethz.ch/R-manual/R-devel/library/base/html/bitwise.html

?bitwShiftL 例如显示相同的页面。它指出:“假设值表示无符号整数,就完成了移位。”

y = -1732584194
bitwShiftR(y,16)  
# [1] 39098     ## wanted -26438


x = 1732584193
bitwShiftR(x,16)
# [1] 26437    ## works as expected

说明如何使用 R 统计编程语言执行有符号班次?

向相反方向移动:

> y = -1732584194
> -bitwShiftR(-y,16) - 1
[1] -26438

您可以定义自己的函数来执行此操作:

Rshift <- function(val, nbits) floor(val/2^nbits)

给出:

y = -1732584194
Rshift(y, 16)
#> [1] -26438

y = 1732584194
Rshift(y, 16)
#> [1] 26437

或者,如果您习惯用 C 编写代码,请在 C 中编写一个函数,然后使用 Rcpp 将其编译为 R 函数:

Rcpp::cppFunction("long long RShift(long long a, int b) { return a >> b;}")

y = -1732584194
RShift(y, 16)
#> [1] -26438

y = 1732584194
RShift(y, 16)
#> [1] 26437