У меня есть устаревший код C ++, который включает в себя множество побитовых операций. Я должен перенести все эти вещи на Scala. Вот какой-то простой способ, например, какая-то библиотека
Редактировать: код C ++ выглядит так:
static uint64_t const C_MASK = 0x3FF;
static uint64_t const C_OFFSET = 46;
static uint64_t const G_MASK = 0x3FF;
static uint64_t const G_OFFSET = 46;
static uint64_t const W_MASK = 0x1FF;
static uint64_t const W_OFFSET = 16;
static uint64_t const H_OFFSET = 25;
static uint64_t const S_MASK = 0xF;
static uint64_t const S_OFFSET = 10;
result |= ((c & C_MASK) << C_OFFSET)
| ((g & G_MASK) << G_OFFSET)
| ((h & W_MASK) << H_OFFSET)
| ((w & W_MASK) << W_OFFSET)
| ((s & S_MASK) << S_OFFSET);
c, g, h, w, s - входные данные.
Я перенес код на Scala как (с константами такими же, как в коде C ++):
def encode(c: Long = 0, g: Long = 0, w: Double = 0,
h: Double = 0, s: Int = 3) = {
val result = ((c & C_MASK) << C_OFFSET)
| ((g & G_MASK) << G_OFFSET)
| ((h & W_MASK) << H_OFFSET)
| ((w & W_MASK) << W_OFFSET)
| ((s & S_MASK) << S_OFFSET);
}
Теперь, чтобы протестировать этот код, у меня есть тестовый код:
val result = encode(c=10, g=20, w=10, h=15, s=3)
val c = (result >>> C_OFFSET) & C_MASK
val g = (result >>> G_OFFSET) & G_MASK
val w = (result >>> W_OFFSET) & W_MASK
val h = (result >> H_OFFSET) & W_MASK
val s = (result >> S_OFFSET) & S_MASK
Значения Я получил как:
c = 0, g = 768, w = 0, h = 0, s = 3
Кроме s, все остальные отличаются от что я передал функции.
Я не уверен, какую ошибку я здесь совершаю.