gmp中bigz的按位运算
Bitwise operations with bigz in gmp
我正在将一些密码学脚本从 Python 翻译成 R。Python 似乎比 R 本身能更好地处理非常大的整数:
10593080468914978578954316149578855170502344604886137564370015851276669104055 >> 1
# 5296540234457489289477158074789427585251172302443068782185007925638334552027
但我知道 R 的 gmp
库可以很好地处理它们(大部分):
as.bigz("10593080468914978578954316149578855170502344604886137564370015851276669104055")
对于上下文,要翻译这些脚本,我需要使用按位运算。问题是这些 bigz
对象被编码为原始值,因此我不能为它们使用基本按位函数,因为它们不兼容。
寻找左右移动位的解决方法很简单,但我需要一些东西:
- 执行
bitwAnd
和 bitwOr
的等效操作
bigz
值
- 没有丢失精度。
有什么想法吗?
奖励:如果您可以根据以 10 为底数的方式提供 bitwAnd
和 bitwOr
的解释,那么它就可以工作。最好使用 R 中的一些示例代码,否则我可以解决它。
我敢肯定肯定有一种更灵活、更快速的方法,但一个选择是这样的……
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
我正在将一些密码学脚本从 Python 翻译成 R。Python 似乎比 R 本身能更好地处理非常大的整数:
10593080468914978578954316149578855170502344604886137564370015851276669104055 >> 1
# 5296540234457489289477158074789427585251172302443068782185007925638334552027
但我知道 R 的 gmp
库可以很好地处理它们(大部分):
as.bigz("10593080468914978578954316149578855170502344604886137564370015851276669104055")
对于上下文,要翻译这些脚本,我需要使用按位运算。问题是这些 bigz
对象被编码为原始值,因此我不能为它们使用基本按位函数,因为它们不兼容。
寻找左右移动位的解决方法很简单,但我需要一些东西:
- 执行
bitwAnd
和bitwOr
的等效操作
bigz
值- 没有丢失精度。
有什么想法吗?
奖励:如果您可以根据以 10 为底数的方式提供 bitwAnd
和 bitwOr
的解释,那么它就可以工作。最好使用 R 中的一些示例代码,否则我可以解决它。
我敢肯定肯定有一种更灵活、更快速的方法,但一个选择是这样的……
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