如何删除 R 中二进制位序列中的结尾零?

How to remove ending zeros in binary bit sequence in R?

我需要从二进制位序列中删除结尾的零。 位序列的长度是固定的,比如52。即

0101111.....01100000 (52-bit), 
10111010..1010110011 (52-bit),
10111010..1010110100 (52-bit).

从将十进制数转换为规范化双精度,有效数是 52 位,因此即使有效数在第一步小于 52 位,也会在右侧填充零。我正在逆转这个过程:也就是说,我正在尝试将内存中的标准化双精度转换为十进制数,因此,我必须删除用于填充 52 位有效数字的零(最后)。

不能保证手头的序列最后一定是0(如上面的第2个例子)。如果有,则必须截断所有结尾的零:

f(0101111.....01100000) # 0101111.....011; leading 0 must be kept
f(10111010..1010110011) # 10111010..1010110011; no truncation
f(10111010..1010110100) # 10111010..10101101

不幸的是,最后被截断的 0 的数量不同。 (第一个示例中为 5;第三个示例中为 2)。

如果输入和输出 class 是 string:

对我来说没问题
f("0101111.....01100000") # "0101111.....011"; leading 0 must be kept
f("10111010..1010110011") # "10111010..1010110011"; no truncation
f("10111010..1010110100") # "10111010..10101101"

非常感谢任何帮助。

这是一个简单的正则表达式。

f <- function(x) sub('0+$', '', x)

解释:

  1. 0 - 匹配字符 0.
  2. 0+ - 字符零重复至少一次,意思是,一次或多次。
  3. $匹配字符串的结尾。
  4. 0+$ 字符 0 重复了一次或多次,直到字符串结束。
  5. 将模式匹配的sub-string替换为空字符串,''.

现在测试功能。

f("010111101100000")
#[1] "0101111011"
f("0100000001010101100010000000000000000000000000000000000000000000") 
#[1] "010000000101010110001"
f("010000000101010110001000000") 
#[1] "010000000101010110001"
f("00010000000101010110001000000")
#[1] "00010000000101010110001"