bitset如何真正起作用

时间:2015-11-09 13:31:18

标签: c++ bitset

我正在使用SRT模拟器,我在实现中使用template <unsigned int larger, unsigned int smaller> bitset<smaller> Partition(const bitset<larger> &original, unsigned int offset) { return bitset<smaller>(original.to_ulong() >> offset); } template <unsigned int larger, unsigned int smaller> void Partition(bitset<larger> &location, const bitset<smaller> &value, unsigned int offset) { location <<= offset; location ^= bitset<larger>(value.to_ulong()); return; } 。在我做到这一点之前,我以为我理解得很清楚:

10111010

第一个函数用于获取更长的数字,并将特定数量的位分区为更短的数字。例如,如果我1011 std::bitset<4>,我只想Partition<8, 4>(my_larger_number, 4); int main() { bitset<16> A("1011101010011000"); cout << "A = " << A << endl; bitset<4> Bs[4]; bitset<16> C; for (int i = 0; i < 4; i++) { Bs[i] = Partition<16, 4>(A, 4 * i); cout << "B[" << i << "] = " << Bs[i] << endl; } for (int i = 3; i >= 0; i--) { cout << "Value of B[" << i << "] = " << bitset<16>(Bs[i].to_ulong()) << endl; Partition<16, 4>(C, Bs[i], 4); cout << "C = " << C << endl; } return 0; } ,那么我会调用A = 1011 1010 1001 1000 B[0] = 1000 B[1] = 1001 B[2] = 1010 B[3] = 1011 Value of B[3] = 0000 0000 0000 1011 C = 0000 0000 0000 1011 Value of B[2] = 0000 0000 1011 1010 C = 0000 0000 0000 1010 Value of B[1] = 0000 1011 1010 1001 C = 0000 1011 0000 1001 Value of B[0] = 1011 1010 1001 1000 C = 0000 1010 0000 1000 。第二个恰恰相反。我可以采用较短的数字并将其转换为更长的数字。这两个函数都按预期工作,直到:

C

此操作的输出为:

Partition<16, 4>(C, Bs[i], 4)

基本上,正在发生的事情是,即使它们被缩短后,位集也以某种方式保存了额外的信息位,然后在每次调用{{1}时将它们推回Bs[i] = Partition<16, 4>(A, i * 4) }。但是,我的问题是,为什么?这些值不应该在内存中保存,即使它们是,我每次调用requests时都会创建新对象,因此不应显示这些值。

任何解释都会有所帮助。

1 个答案:

答案 0 :(得分:0)

感谢对我原帖的有用评论,我发现问题不在于std::bitset的C ++实现,而在于我用来编译它的Xcode g ++中的一些奇怪现象。为了解决这个问题,我创建了Partition的更改版本:

template <unsigned int larger, unsigned int smaller>
    bitset<smaller> Partition(const bitset<larger> &original, unsigned int offset) {
        bitset<smaller> newValue(0);
        newValue = ((original >> offset) & bitset<larger>((1 << smaller) - 1)).to_ulong();
        return newValue;
    }

本质上,我所做的只是屏蔽第一个smaller位,然后使其他位为0.我不喜欢这样做,因为它增加了复杂性,但它似乎是唯一的解决方案可用,但没有弄清楚Xcode如何做到这一点。