在gmp中使用bigz的按位运算

时间:2018-04-28 13:30:22

标签: r bitwise-operators gmp

我正在将一些加密脚本从Python翻译成R. Python似乎比R本身处理非常大的整数:

10593080468914978578954316149578855170502344604886137564370015851276669104055 >> 1
# 5296540234457489289477158074789427585251172302443068782185007925638334552027

但是我知道R的gmp库,它可以很好地处理它们(主要是):

as.bigz("10593080468914978578954316149578855170502344604886137564370015851276669104055")

对于上下文,要翻译这些脚本,我需要使用按位运算。问题是这些bigz对象被编码为原始值,因此我不能使用基本的按位函数,因为它们是不兼容的。

找到向左和向右移动位的解决方法是直接的,但我需要的东西会:

  • 执行相当于bitwAndbitwOr
  • 的操作
  • 点击bigz
  • 没有失去精确度。

有什么想法吗?

额外奖励:如果您可以根据基数10提供bitwAndbitwOr的解释,那么这可行。最好用R中的一些示例代码,如果不是,我可以解决它。

1 个答案:

答案 0 :(得分:1)

我确定必须有一种更快捷,更快捷的方式,但有一种选择就是这样......

library(gmp)

z <- as.bigz("10593080468914978578954316149578855170502344604886137564370015851276669104055")  
w <- as.bigz("1234874454654321549879876546351546654456432132321654987584654321321")

#express as numeric vectors of 0s and 1s
z1 <- as.numeric(charToRaw(as.character(z, b=2)))-48
w1 <- as.numeric(charToRaw(as.character(w, b=2)))-48

#normalise the lengths
mx <- max(length(z1), length(w1))
z1 <- c(rep(0, mx-length(z1)), z1)
w1 <- c(rep(0, mx-length(w1)), w1)

#then do & or | and convert back to bigz
zandw <- as.bigz(paste0("0b", rawToChar(as.raw(1*(z1 & w1) + 48))))
zorw <- as.bigz(paste0("0b", rawToChar(as.raw(1*(z1 | w1) + 48))))

zandw
Big Integer ('bigz') :
[1] 905773543034890641004226585015137324621885921615658881499355162273

zorw
Big Integer ('bigz') :
[1] 10593080469244079490573747058454505131838753934720683775076011957361968263103