C ++ побитовая маскировка и сдвиг - PullRequest
0 голосов
/ 14 марта 2020

У меня есть устаревший двоичный код операции C ++, подобный этому:

constexpr static uint64_t val2bin(double val) {
    uint64_t bin = (val > 0.) ? uint64_t(val/0.01)+1 : 0;
    return (bin > 510) ? 511 : bin;
}

И результат затем используется как часть выражения:

static uint64_t const MASK = 0x1FF;
static uint64_t const VAL_OFFSET = 10;
((val2bin(val) & MASK) << VAL_OFFSET)

Разве он не ставит верхний лимит на val мы можем кодировать таким образом? Я не могу понять, чего мы пытаемся достичь функционально этим?

1 Ответ

0 голосов
/ 14 марта 2020

Разве это не устанавливает верхний предел для val, который мы можем кодировать таким образом?

Он установит верхний предел для выходного сигнала, который вы можете иметь. Операция, выполненная здесь:

static uint64_t const MASK = 0x1FF;
static uint64_t const VAL_OFFSET = 10;
((val2bin(val) & MASK) << VAL_OFFSET)

даст val<<VAL_OFFSET в качестве вывода для val < 0x1FF и, следовательно, не превысит предел uint64_t. Для значений, превышающих 0x1FF, выходной сигнал будет MASK << VAL_OFFSET, который по-прежнему не будет превышать предел uint64_t ( т.е. MASK = 511, следовательно, выходной сигнал будет 523264 ). Это вышеупомянутый «верхний предел» на выходе , т. Е. 523264.

Я не могу понять, чего мы пытаемся достичь функциональным путем?

Даже я не могу точно понять, какую функциональность мы пытаемся достичь здесь. Может быть, вы можете предоставить дополнительный фрагмент кода вокруг этого фрагмента, и это может помочь. Я знаю, что этот ответ говорит об очевидном, но это все, что я могу сделать на данный момент.

Best.

...