首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将std::bitset<N>转换为std::bitset<M>?

如何将std::bitset<N>转换为std::bitset<M>?
EN

Stack Overflow用户
提问于 2019-06-10 03:00:30
回答 1查看 271关注 0票数 3

如果我有一个std::bitset<16>,我如何将它转换成高位填充为0的std::bitset<32>

代码语言:javascript
复制
std::bitset<16> a = 0xFF00;
std::bitset<32> b = a;  // error
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-10 03:00:30

如果位数小于ullong_limits::digits (通常为64位),则可以通过中间unsigned long long进行转换

代码语言:javascript
复制
#include <limits>
#include <bitset>

template<size_t M, size_t N>
std::bitset<M> resize(std::bitset<N> const& in) {
    using ullong_limits = std::numeric_limits<unsigned long long>;
    static_assert(M <= ullong_limits::digits);
    static_assert(N <= ullong_limits::digits);
    return std::bitset<M>(in.to_ullong());
}

如果不是,则需要将位集分解为ullong片段,然后将它们放回一起:

代码语言:javascript
复制
#include <limits>
#include <bitset>
#include <utility>

namespace detail {
    using ullong_limits = std::numeric_limits<unsigned long long>;

    template<size_t N>
    constexpr std::bitset<N> all_ullong_bits() {
        return std::bitset<N>(ullong_limits::max());
    }

    /** Resize a bitset, but keeping only the nth ullong */
    template<size_t N, size_t I, size_t M>
    std::bitset<N> resize_nth_ullong(std::bitset<M> const& in) {
        return std::bitset<N>(
            (
                (in >> (ullong_limits::digits * I)) & all_ullong_bits<M>()
            ).to_ullong()
        ) << (ullong_limits::digits * I);
    }

    template<size_t M, size_t N, size_t... I>
    std::bitset<M> resize_helper(std::bitset<N> const& in, std::index_sequence<I...>) {
        return (resize_nth_ullong<M, I>(in) | ... | std::bitset<M>());
    }
}

template<size_t M, size_t N>
std::bitset<M> resize(std::bitset<N> const& in) {
    return detail::resize_helper<M>(in, std::make_index_sequence<
        (N + detail::ullong_limits::digits - 1) / detail::ullong_limits::digits
    >{});
}

在这两种情况下,您都可以使用

代码语言:javascript
复制
std::bitset<32> b = resize<32>(a);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56517542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档