1

重複の可能性:
C / C ++で16進数、2進数、10進数の間で効率的に変換します

アセンブリ言語クラスを受講していて、符号付き整数を入力として受け入れ、対応する2の補数を出力するアプリケーションを作成するように求められました。私はインターネットのいたるところで役立つコードを見つけようとしていますが、見つけることができるのは正確なバイナリに変換するコードだけです(先行ゼロで必要な16ビット形式ではありません)。これは私がこれまでに持っているコードです:

#include<iostream>
#include<string>
using namespace std;


string binaryArray[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void toBinary(int);
void convertNegative();

int main()
{
cout << "This app converts an integer from -32768 to 32767 into 16-bit 2's complement binary format" << endl;

cout << "Please input an integer in the proper range: ";

int num;
cin >> num;

if (num < -32768 || num > 32767)
    cout << "You have entered an unacceptable number, sorry." << endl;
if (num < 0)
{
    toBinary(num);
    convertNegative();
}
else
    toBinary(num);
cout << endl;

system("pause");
return 0;
}

私のtoBinary関数は、インターネットで10進数から2進数に変換できる関数でしたが、コンソールに出力している場合にのみ機能し、負の数では機能しないため、2の補数を取ることはできません。何か案は?

4

1 に答える 1

2

数値の2の補数を計算するには、数値を反転し(0ビットすべてを1に変更し、1ビットすべてを0に変更します)、次に1を追加します。とても簡単です。ただし、そもそも数値が負の場合にのみ、これを行う必要があります。非負数の2の補数は、単に数値自体(変換されていない)です。

ただし、数値を入力として受け取り、それを変数「num」に格納しています。その変数は2の補数形式です。それはあなたのコンピュータがそれを保存する方法です。2の補数形式に「変換」する必要はまったくありません。一度に1つずつビットをシフトして印刷すると、その数の2の補数が得られます。それらを正しい順序でシフトし、毎回左端のビットを選択するだけで、ソリューションが得られます。本当に短くてシンプルです。

于 2013-01-29T19:56:19.173 に答える