0

ビットの文字列の2の補数を返す関数を実装しようとしています。私は2つの品種を試しましたが、奇妙な結果が得られました。

バージョン1(反転は実行しますが、「+ 1」は実行しません):string twosComp(signed int number){

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

私はこれらの機能の両方のさまざまな反復を試みてきました。私はこれで蒸気が不足しています。誰かがより良い選択肢を持っているなら-私はこの時点で提案を非常に受け入れています。

4

3 に答える 3

3

(abs(number) ^ 0xffffffff) + 1、そしてその値を文字列に変換するのはどうですか?

編集:また、なぜsize = 3ですか?intは32ビットで、通常は

于 2013-02-11T03:30:04.817 に答える
0

次のコードは、短い(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
}
于 2013-02-11T03:59:48.350 に答える
0

参考までに、ビットセットを使用してC ++で整数を2の補数に変換するための以下のリンクを参照してください: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()メソッドを使用して、表現を文字列に変換できます。

于 2014-09-11T01:11:25.397 に答える