繁体   English   中英

int64_t 到 std::vector<bool> 仅使用 `std`</bool>

[英]int64_t to std::vector<bool> using only `std`

假设x是一个int64_t 我怎样才能有效地将它转换为具有 64 个元素的std::vector<bool>x的每一位一个,而不使用std以外的其他库?

编辑: std::bitset<64>对我来说不是一个选项,例如因为我需要在其上调用push_backstd::find

下面的makeVec function 将允许您将 64 位值转换为 boolean 向量:

#include <iostream>
#include <vector>
#include <cstdint>

std::vector<bool> makeVec(int64_t x) {
    std::vector<bool> retVal;
    uint64_t mask = 1ULL << 63;
    for (int i = 0; i < 64; ++i) {
        retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
        mask >>= 1;
    }
    return retVal;
}

int main() {
    auto vec = makeVec (42);
    for (int i = 0; i < 64; ++i) {
        std::cout << (vec[i] ? '1' : '0');
    }
    std::cout << '\n';
}

但是,您可能会发现为此使用位bitset更容易,因此您的代码变得更简单:

#include <iostream>
#include <bitset>

int main() {
    auto vec = std::bitset<64>(42);
    for (int i = 63; i >= 0; --i) {
        std::cout << vec[i];
    }
    std::cout << '\n';
}

您会注意到的一个区别是位位置的反转。 对于位集,position 零是最低有效位,因此您必须为此进行调整。


如果您想在矢量解决方案中进行类似的排序(零索引是最低有效位),那只需要更改几行即可:

std::vector<bool> makeVec(int64_t x) {
    std::vector<bool> retVal;
    uint64_t mask = 1;                 // This one ...
    for (int i = 0; i < 64; ++i) {
        retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
        mask <<= 1;                    // ... and this one.
    }
    return retVal;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM