【问题标题】:Bitset in C++, about continuously addC++中的Bitset,关于不断添加
【发布时间】:2014-04-12 23:29:20
【问题描述】:

我想向 bitset 添加 1 个值,直到它溢出,我想知道如何做到这一点,例如:

位集 foo; (foo=00000 00000 00000 00000) 怎么实现这个功能,不断加一个

00000 00000 00000 00000 00000 > 00000 00000 00000 00000 00001 > 00000 00000 00000 00000 >00010 > 00000 00000 00000 00000 0000011 直到溢出

我正在考虑两种方法;

foo.to_ulong();

如何将 unsigned long 再次转换回 bitset? C++ 文档表明这是可能的,但是在库中,我只能看到 bitset (unsigned long val),它正在创建一个新的 bitset

2。 不知何故位操作,都卡住了,需要帮助

【问题讨论】:

  • 没有办法让 bitset '溢出'
  • @DieterLücking 我猜 OP 意味着将 bitset 视为任意但固定大小的整数的二进制表示。

标签: c++ bitset


【解决方案1】:

您可以使用以下内容:http://ideone.com/C8O8Qe

template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
    for (std::size_t i = 0; i != bs.size(); ++i) {
        if (bs.flip(i).test(i) == true) {
            return true;
        }
    }
    return false; // overflow
}

然后迭代所有值:

std::bitset<20> bs;

do {
    std::cout << bs << std::endl;
} while (increase(bs));

【讨论】:

  • 这样不行,循环的时间刚好是size_t,我想每次加一个,表示复杂度2次方size_t
  • 我喜欢内在条件的简洁。但为什么要与真实相比?否则我会碰到这个;-)
  • @javarookie 您的复杂性“分析”非常离谱。添加 1 的工作量为 O(n/2),其中 n = bitset.size()。没有比这更好的了,因为转换为 int 需要同样长的时间。 - 并且:编写一个计算 2^n 的程序,看看你写了什么......
  • @laune:我更喜欢明确,但你说得对,== true 可以省略。
  • @laune:关于复杂性,OP 希望看到调用 increase 的循环(这不是我最初的答案(但在现场示例中)。
【解决方案2】:

以下代码应该对您有所帮助:

bitset<20> b;

bool overflow = false;
while( ! overflow ){
    cout << b << endl; // prints bits in reversed order
    int ipos = b.size();
    overflow = true;
    while( overflow && --ipos >= 0 ){ 
        overflow = b[ipos];
        b[ipos] = ! b[ipos];
    }
}

由@Jarod42 测试,谢谢。

【讨论】:

  • 但它确实会产生您要求的值序列。在最后一个右大括号之前插入位集的打印输出。
  • @javarookie 无论如何您都不能“添加”一点。翻转是在进位为 1 且另一个操作数为 0 时确定加法器中当前位的值的逻辑的简化。进位是旧值。
  • @Jarod42 +1,位顺序是定义问题。可能会从 0 运行循环到 size()-1 - 随便什么。
  • @laune 对不起,车道,我的错。现在是我真正研究代码的时候了,为什么首先我没有得到它。真的很抱歉
猜你喜欢
  • 2012-07-27
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多