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

Sum of binary numbers in C++ and overflow bit?

本文关键字:二进制数 出位 溢出 C++      更新时间:2023-10-16

>我需要帮助添加以"位"连接的 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);
}

可能的问题:

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

正确初始化位集后,就不能使用 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
}