【问题标题】:the best way define a mask定义掩码的最佳方法
【发布时间】:2013-01-09 14:32:01
【问题描述】:

我编写了一个函数,它应该从unsigned int 延迟的位集合中提取。 我想为此使用掩码。我不确定定义此类掩码的最佳方法是什么。 例如,我需要提取位 6:14。所以我需要将掩码定义为111111111 << 6。 我的问题是我不能使用 boost 或类似的东西,标准的 c/c++ 不知道使用二进制数。 可以做的是将 111111111 用作 2^10-1。我不确定 - 这是最好(最优雅)的解决方案。有什么建议吗?

【问题讨论】:

标签: c++ binary mask


【解决方案1】:

大多数人在表示掩码时使用十六进制,例如0xFF、0x0A等

【讨论】:

    【解决方案2】:

    我们先试着做一堆。

    二进制 N 个 1 的序列的一个特性是,就像十进制中的 9 序列一样,如果向其添加 1,则会得到一个 1 后跟 N 个 0。我们可以使用相反的情况,如果你从一个减去一个,然后是 N 个零,就会得到一个包含 N 个 1 的序列。

    1 后跟 N 个零只是右移 N 个位置。

    template <typename Uint>
    Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html
        return 1 << n - 1; // same as 2^n - 1 :)
    }
    

    有了任意长度的 zigamorphs,您现在可以通过使用按位与轻松地从任意值中获取您想要的位。

    template <typename Uint>
    Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive?
        return value & zigamorph<Uint>(last_bit-first_bit+1);
    }
    

    【讨论】:

      【解决方案3】:

      只需使用0x1FF &lt;&lt; 6(如果你想要111111111 &lt;&lt; 6)或0x3FF << 6(如果你想要2^10-1 1 << 10 得到 2^10,但我不相信这是 比仅使用十六进制更清晰。 (对于这个问题, 在某些情况下,0x7FC00 可能非常清楚。它有 您可以直观地看到这些位的确切位置的优势 一句话,如果你有一个十六进制,就更容易把它们挑出来 转储。)

      【讨论】:

        【解决方案4】:

        您可以访问标准库吗?如果是这样,我会尝试std::bitset

        Here 是它的文档。

        【讨论】:

        • 如果问题被标记为c++,您可以放心地假设您可以使用标准库,除非另有明确说明。
        猜你喜欢
        • 1970-01-01
        • 2018-11-11
        • 2023-03-18
        • 2015-04-24
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        相关资源
        最近更新 更多