-2

我需要帮助添加在“位”中连接的 16 位。每次连接一组 16 位时,我都希望将它们添加(二进制加法)到一个数组中……直到我的字符串中的所有 16 位组都完成。如果存在溢出,则最终总和的长度 >16...然后将该额外位作为 0000000000000001 添加到最终总和(其中 1 是第 16 位)。

对于输入的字符串:“hello”

std::vector<std::string> bitvec;
std::string bits;
for (int i = 0; i < s.size(); i += 2) {
    bits = std::bitset<8>(s[i]).to_string() + std::bitset<8>(s[i + 1]).to_string();
    bitvec.push_back(bits);
}
4

1 回答 1

0

可能出现的问题:

如果shold "hello"std::bitset<8>(s[i])则为 0。您需要将仅包含“1”和“0”的字符串传递给bitset 构造函数

一旦您的位集被正确初始化,您就不能使用该函数将它们添加在一起to_string(),这只会连接表示: "1011" + "1100"将成为"10111100"

哦,等等,也许这就是你想要的。
听起来您正在发明一种复杂的方法来将解释为 16 位数字的 ascii 值对相加,但尚不清楚。您的代码大致相当于:

std::vector<uint16_t> bitvec;
unsigned char* cp = s.c_str()+1;
while (*cp) {
   uint16_t bits = *(cp-1)>>8 + *(cp);
   bitvec.push_back(bits);
}
//sum over the numbers contained in bitvec here?

uint32_t sum=0;

for(std::vector<int16_t>::iterator j=bitvec.begin();j!=bitvec.end();++j) {
   sum += *j;
   uint16_t overflow = sum>>16;  //capture the overflow bit, move it back to lsb
   sum &= (1<<16)-1;    //clear the overflow
   sum += overflow;     //add it back as lsb
}
于 2013-11-08T15:16:40.837 回答