我想实现一个左移函数,它会在溢出时触发失败。
这是我的代码:
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/