Проблема с функцией дополнения до двух

Попытка реализовать функцию, возвращающую дополнение двух строк битов. Я пробовал две разновидности и получаю странные результаты.

Версия 1 (делает инверсию, но не «+1»):
строка twosComp (со знаком int) {

string twosComp(signed int number) {

if ( number == 0 ) { return "1"; }
if ( number == 1 ) { return "0"; }

if ( number % 2 == 0 ) {
return twosComp(number / 2) + "1";
}
else {
return twosComp(number / 2) + "0";
}
}

Версия 2 (инвертирует и пытается «+1», но не всегда делает это правильно)

string twosComp(signed int number) {

bool bit = 0;
int size = 3; // not sure what to do about this, value could be -32768 to 32767
string twos;
number = ~abs(number) + 1;

for(int i = 0; i < size; i++) {

//Get right-most bit
bit = number & 1;
if(bit) {
twos += '1';
}
else {
twos += '0';
}

//Shift all bits right one place
number >>= 1;
}

return twos;
} // end twosComp

Я пробовал различные итерации обеих этих функций. Я выдыхаюсь на этом. Если у кого-то есть лучший вариант — я ОЧЕНЬ открыт для предложений на данный момент.

0

Решение

как насчет (abs(number) ^ 0xffffffff) + 1, а затем превратить это значение в строку?

редактировать: также, почему size = 3? целые 32 бита, обычно

3

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

Следующий код делает то, что вы хотите для короткого (16 бит) int: примечание — я написал это на C, а не на C ++ …

char* twosComplement(signed int n) {
static char s[17];  // static so the variable persists after the call
unsigned int i;
int j;
i = (2<<16)-n; // definition of twos complement

for(j=0;j<16;j++){
s[15-j] = ((i&1)==0)?'0':'1'; // test lowest bit
printf("%c", s[15-j]);        // print for confirmation
i=i>>1;                       // right shift by one
}
printf("\n"); // just to make output look clean
s[16]='\0';   // terminate the string
return s;
}

int main() {
printf("the string is %s\n", twosComplement(15)); // just an example
}
0

Для справки вы можете взглянуть на ссылку ниже для преобразования целого числа в комплимент 2 в C ++ с использованием bitset:
http://2scomplimentcpp.blogspot.com.au/

#include <iostream>
#include <bitset>

using namespace std;

int disp_number()
{
int i = 0;
cout << "Enter Intiger : " ;
cin >> i;
cout << "decimal : " << std::dec << i << endl;
cout << "hex : " << std::hex << i << endl;
cout << "oct : " << std::oct << i << endl;
cout << "Binary : " << (bitset<16>)i << endl;
cout << "Inverse : " << bitset<16>(~i) << endl;
i = (0 <= i)?i:(-1)*i;
cout << "One's compliment : " << ~(bitset<16>)i << endl;
int d = ((bitset<16>)i).flip().to_ulong();
cout << "Two's compliment : " << bitset<16>(++d) << endl;
return 0;
}

Вы можете использовать to_string () метод bitset, чтобы преобразовать представление в строку.

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