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

Posted

技术标签:

【中文标题】使用 R,如何对有符号(负)整数进行按位移位?【英文标题】:Using R, how to do bitwise shifting for signed (negative) integers? 【发布时间】:2020-11-14 21:55:18 【问题描述】:

在 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 统计编程语言执行有符号移位?

【问题讨论】:

【参考方案1】:

换个方向:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

您知道如何将此 Rcpp 语法添加到我在 github 上托管并使用 Rstudio 构建的 R 库中吗?

以上是关于使用 R,如何对有符号(负)整数进行按位移位?的主要内容,如果未能解决你的问题,请参考以下文章

Java负整数的左移右移无符号右移

了解 128 位数字的左右按位移位

Java位移运算

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字