C ++按位屏蔽和移位

时间:2020-03-14 07:00:35

标签: c++ bit-manipulation

我有一个像这样的传统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 :(得分:0)

这不是对我们可以用这种方式编码的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的限制( ie MASK = 511,因此,输出为 523264 )。这是输出 523264的上述“上限”。

我无法理解我们正在通过功能实现的目标吗?

即使我无法完全理解我们要在此处实现的功能。也许您可以在此代码段周围提供一些额外的代码,这可能会有所帮助。 我知道这个答案说的很明显,但是到目前为止,我可以推断出所有这些。

最好。

相关问题