как взять 1с дополнения в C ++ в следующем коде?

Я хочу взять дополнение 1 с любых битов в сумме + и сохранить дополненные биты в финальной сумме. как это сделать. Я немного слаб в использовании вещей типа bitvec и uint32_t. так что я запутался здесь. пожалуйста помоги.

#include <iostream>
#include <string>
#include <bitset>
using namespace std;
#include <vector>
#include <stdint.h>

int main() {
int i;
string j;

std::string message = "hello "; // Some string.
std::vector<uint16_t> bitvec;
unsigned char* cp = message.c_str()+1;
while (*cp) {
uint16_t bits = *(cp-1)>>8 + *(cp);
bitvec.push_back(bits);
}

uint32_t sum=0;
uint16_t overflow=0;

for(auto j = bitvec.begin(); j != bitvec.end(); ++j) {
sum += *j;
std::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
}

uint32_t finalsum=0;
for (k=0; k<=sum.length(); k++)
{finalsum = !(sum[k])]
}

cout << finalsum ;
return 0;

}

1

Решение

Похоже, вы пытаетесь реализовать что-то вроде контрольной суммы дополнения 1 в TCP.

// Compute the sum.  Let overflows accumulate in upper 16 bits.
for(auto j = bitvec.begin(); j != bitvec.end(); ++j)
sum += *j;

// Now fold the overflows into the lower 16 bits.  This requires two folds, as the
// first fold may generate another carry.  This can't happen more than once though.
sum = (sum & 0xFFFF) + (sum >> 16);
sum = (sum & 0xFFFF) + (sum >> 16);

// Return the 1s complement sum in finalsum
finalsum = sum;

Это должно сделать свое дело.

На отдельном примечании, я думаю, что вам нужно cp += 2 где-то в этом цикле:

while (*cp) {
uint16_t bits = *(cp-1)>>8 + *(cp);
bitvec.push_back(bits);
cp += 2;  // advance to next pair of characters
}

Этот цикл также потерпит неудачу, если ваша входная строка не будет четным числом символов, поэтому попробуйте переписать ее более надежно …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]