C ++和溢出位中的二进制数之和?

时间:2013-11-08 14:53:52

标签: c++ arrays binary numbers sum

我需要帮助添加在'bits'中连接的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);
}

1 个答案:

答案 0 :(得分:0)

可能出现的问题:

如果s成立"hello",则std::bitset<8>(s[i])将为0.您需要将仅包含“1”和“0”的字符串传递给bitset constructor

正确初始化您的位集后,您无法使用to_string()函数将它们添加到一起,只会连接表示形式:"1011" + "1100"将变为"10111100"

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

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
}