Руби Беззнаковое Правое Сдвиг - PullRequest
1 голос
/ 31 января 2012

У меня есть фрагмент кода Java: return (int)(seed >>> (48 - bits));

Как вы можете видеть, он использует беззнаковый оператор смещения вправо (>>>).Я пытаюсь реализовать этот код в ruby, в котором нет беззнакового оператора сдвига вправо, только подписанный оператор правого сдвига.Поскольку я не очень хорошо знаком с оператором >>>, я не совсем уверен, как бы я реализовал это в ruby.Я попытался сделать несколько поисков, чтобы увидеть, сталкивался ли кто-нибудь с этой проблемой раньше, но не смог найти ничего подходящего.Любая помощь будет высоко ценится:)

1 Ответ

2 голосов
/ 31 января 2012

Оператор сдвига без знака может быть легко реализован с помощью простого сдвига и маскирования битов:

public static int unsignedShift(int amt, int val) {
    int mask = (1 << (32 - amt)) - 1;   
    return (val >> amt) & mask;
}

Маска работает, устанавливая все биты в 1, которые должны быть сохранены после сдвига.Обратите внимание, что это возвращает разные результаты по сравнению с Java для amt> = 32 и amt = 0.

...