gpt4 book ai didi

c++ - 如何制作未定义的移位 “correct”

转载 作者:行者123 更新时间:2023-12-01 14:52:13 31 4
gpt4 key购买 nike

在C++中,将n -bit整数移位n是未定义的行为:

std::uint64_t v = 1;
v = v << 64; // Undefined behaviour
std::cout << v << std::endl;
上面的代码在我的机器上打印 1。这样的移位的“正确”结果应该为0,并且天真的解决方法是使用分支:
std::uint64_t v = 1;
std::uint64_t offset = 64;
v = offset >= 64 ? 0 : v << offset;
std::cout << v << std::endl;
有没有不用分支就可以得到相同结果的方法?

最佳答案

是。
我们要解决的问题是,如果offset大于或等于64,则结果为零。
战略:

  • 向右偏移6位,称为temp
  • 如果temp为零,我们想将掩码初始化为全部1位,否则全部为0位。我们可以通过设置mask = !!temp - 1来实现。
  • 现在只需按位-以及voffsetmask即可。

  • 实现方式:
    uint64_t shift(uint64_t value, uint64_t offset) {
    uint64_t temp = offset >> 6;
    uint64_t mask = (!!temp) - 1;
    return (value & mask) << (offset & mask);
    }
    除了移动 offset之外,您还可以按位进行操作-并且使用 ~0x3F可能会更快。
    uint64_t shift(uint64_t value, uint64_t offset) {
    uint64_t mask = (!!(offset & ~0x3F)) - 1;
    return (value & mask) << (offset & mask);
    }

    关于c++ - 如何制作未定义的移位 “correct”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62493033/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com