我正在使用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
时都会创建新对象,因此不应显示这些值。
任何解释都会有所帮助。
答案 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如何做到这一点。