Портирование битовых операций C ++ на Scala битовых операций - PullRequest
0 голосов
/ 05 марта 2020

У меня есть устаревший код 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, все остальные отличаются от что я передал функции.

Я не уверен, какую ошибку я здесь совершаю.

...