c++ - 实现安全左移

标签 c++ c bit-shift integer-overflow

我想实现一个左移函数,它会在溢出时触发失败。

这是我的代码:

uint32_t safe_shl(uint32_t x, uint8_t y) {
    uint32_t z = x << y;
    assert((z >> y) == x);
    return z;
}

请假设我的 assert 函数在我的系统中记录了一个错误。

我想确保我的方法是防弹的(即,在每次错误输入时失败,并且只在错误输入时失败)。

而且我还想问一下您是否知道更有效的实现方式(假设它确实是防弹的)。

最佳答案

如果x << y未定义,所有赌注均无效。
唯一安全的方法是在尝试之前检查它是否有效。

uint32_t safe_shl(uint32_t x, uint8_t y) {
    assert (y < 32);
    if (y < 32)
    {
        uint32_t z = x << y;
        assert((z >> y) == x);
        return z;
    }
    return 0;
}

请注意,您需要条件 - 无条件移位让编译器假定 y < 32是真的。

关于c++ - 实现安全左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47940683/

相关文章:

c++ - 旋转时立方体未按预期呈现

c++ - 最佳实践 : how to interpret/process QDataStream?

c - 将 C/C++ 变量存储在处理器缓存中而不是系统内存中

c++ - C包括守卫

c++ - 通过用于 Objective-C/iOS 的 UIInterfaceOrientationMask 了解 C++ 枚举

c++ - 模板函数静态变量

c++ - 在 C/C++ 中加载 OpenSSL 自定义引擎

c - 如何在不使用 C 中的 typedef 的情况下声明一个返回指向函数指针的函数,该函数返回一个函数指针?

c++ - 零位移位会正常工作吗?

rust 溢出左移