C++中的bitset的高阶位与低阶位?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的bitset的高阶位与低阶位?相关的知识,希望对你有一定的参考价值。

“bitset<32> bitvec, 以0位开始的位串是低阶位, 以31位开始的位串是高阶位”,那么第1至30位是低阶位还是高阶位?

计算机里面的位串有两种排列顺序,即big endian和small endian,也就是你所说的高阶位和第阶位。

举一个例子,你可能就明白了。
比如说位串 0101,一共有4位,它的值的十进制是5。5 = 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0。从左到右,其阶依次为3, 2, 1, 0。

如果我们按从左到右的顺序把这4个bit放到bitset中(高阶放到了低位,低阶放到了高位),那就是 bitvec[0] = 0, bitvec[1]=1, bitvec[2]=0, bitvec[3]=1。很明显,bitvec[3]的阶位是0,最低,bitvec[0]的阶是3,最高。所谓以xx位开始的,也就是说xx位的阶是0。在我们这个例子中,bitvec[3]的阶是0,那就是一个big endian排序。

如果我们按从右到左的顺序把这5个bit放到bitset中(低阶放到了低位,高阶放到了高位),那就是bitvec[0]=1, bitvec[1]=0, bitvec[2]=1, bitvec[3]=0。 也就是说bitvec[0]是其最低阶, bitvec[3]是最高阶。很明显我们的0101串应该从bitvec[0]开始, 就是一个small endian的bit排序。
参考技术A 高和低是相对的。
0位相对于其他所有位都是低阶位,31位相对于其他所有位都是高阶位。
1位相对于0位高,相对于2至31位都是低,其他的也类似。
不过一般来说,比如一个int(32位),我们可以称0-15位为低16位,16-31位为高16位。总体来说,高位和低位都是相对的。
参考技术B “bitset<32> bitvec, 以0位开始的位串是低阶位, 原位异能是指本属性异能,许多魔法小说里面说的 参考技术C 应该0-15是低位, 16-31是高位吧.前半部分是低,后半部份是高. 参考技术D 高低都是相对的,你说你和姚明谁高?你和你家宝宝谁高?

如何将 C++ 位集中的位范围子集转换为数字? [复制]

【中文标题】如何将 C++ 位集中的位范围子集转换为数字? [复制]【英文标题】:How to convert a range subset of bits in a C++ bitset to a number? [duplicate] 【发布时间】:2013-07-25 07:42:27 【问题描述】:

我有一个 std::bitset 并且 bitset 类型还提供了一个 to_ulong 方法来将 bitset 转换为数字,我的问题是将 bitset 转换为数字,同时只考虑该 bitset 中的范围,我需要实现我自己的 powerof2 函数还是有更标准的方法?

【问题讨论】:

【参考方案1】:

您可以删除不必要的部分,例如

#include <bitset>
#include <iostream>

// drop bits outside the range [R, L) == [R, L - 1]
template<std::size_t R, std::size_t L, std::size_t N>
std::bitset<N> project_range(std::bitset<N> b)

    static_assert(R <= L && L <= N, "invalid bitrange");
    b >>= R;            // drop R rightmost bits
    b <<= (N - L + R);  // drop L-1 leftmost bits
    b >>= (N - L);      // shift back into place
    return b;


int main()

    std::bitset<8> b2(42); // [0,0,1,0,1,0,1,0]
    std::cout << project_range<0,8>(b2).to_ulong() << "\n"; // 42 == entire bitset
    std::cout << project_range<2,5>(b2).to_ulong() << "\n"; // 8, only middle bit

Live example 带输出。

【讨论】:

@user2485710 我在原始版本中犯了一些错误。这个已经过测试,请看现场示例。 等等,对我不起作用,在这种情况下 ideone.com/RNJXNH 我的程序应该打印 15,它打印 120 因为它不会丢弃最右边的位... @user2485710 bits [3, 7) as a subset of [0,32) 表示 120,如果再右移 3 位,则得到 15。如果是您想要的行为,只需将最后一条语句更改为:b &gt;&gt;= (num - l + r);【参考方案2】:

你可以使用string作为中间存储:

bitset<32> bs (string("1011"));
cout << bs.to_ullong() << endl;

// take a range - 2 last bits in this case
string s = bs.to_string().substr(bs.size() - 2);  

bitset<32> bs1 (s);
cout << bs1.to_ullong() << endl;

打印:

11 3

【讨论】:

很高兴有选项,但我认为这会产生不必要的临时变量。我需要将我的步数缩小到一个非常小的数字。

以上是关于C++中的bitset的高阶位与低阶位?的主要内容,如果未能解决你的问题,请参考以下文章

[SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解

C#高阶-反射

数组的高阶方法

啥是高阶矩阵

:高阶分类-核方法与SVM

STL容器 -- Bitset