使用 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
在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