Как убрать конечные нули в двоичной битовой последовательности в R? - PullRequest
0 голосов
/ 01 июня 2019

Мне нужно удалить конечные нули из двоичных битовых последовательностей.Длина битовой последовательности фиксирована, скажем, 52. т. Е.

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

От преобразования десятичного числа в нормированную двойную точность значимость составляет 52 бита, и, следовательно, нули заполняются с правой стороны, даже если они значимы именьше 52 бит на первом шаге.Я переворачиваю процесс: то есть я пытаюсь преобразовать нормализованную двойную точность в памяти в десятичное число, следовательно, я должен удалить нули (в конце), которые используются для заполнения 52 битов для значимости.

Не гарантируется, что последовательность в руке обязательно будет иметь 0 в конце (как во втором примере выше).Если это так, все конечные нули должны быть усечены:

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

К сожалению, количество усеченных нулей в конце отличается.(5 в 1-м примере; 2 в 3-м примере).

Это нормально для меня, если класс ввода и вывода string:

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

Любая помощь очень ценится.

1 Ответ

1 голос
/ 01 июня 2019

Это простое регулярное выражение.

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

Пояснение:

  1. 0 - соответствует символу 0.
  2. 0+ - символ ноль повторяется как минимум один раз, то есть один или несколько раз.
  3. $ соответствует концу строки.
  4. 0+$ символ 0 повторяется один или несколько раз и ничего больше до конца строки.
  5. Заменить подстроку, соответствующую шаблону, пустой строкой, ''.

Теперь протестируйте функцию.

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