1

現在、10進数を2進数に変換しており、8ビットであることを確認しています。〜(NOT)演算を除くすべてのビット演算が機能します。それらは巨大な整数値として出てきます。他のビット演算が機能するため、理由はわかりません。これが私のコードです:(コメントアウトされた行は機能していないものです)

編集:8ビットのバイナリ文字列を取得したい場合はどうすればよいですか?unsigned charsを使用しますか?すべてのunsignedintをunsignedcharsに変更すると、BinaryToDecimal関数が誤ったバイナリ変換を生成します。

#include <iostream>
#include <string>

using namespace std;

string BinaryToDecimal(unsigned int dec)
{
    string binary   = "";
    float remainder = 0.0f;

    while( dec != 0 )
    {
        remainder = dec % 2;
        dec      /= 2;

        if( remainder == 0 )
            binary.append("0");
        else
            binary.append("1");
    }


    // Reverse binary string
    string ret = string(binary.rbegin(), binary.rend());

    return ret;
}

int main()
{
    unsigned int a = 0;
    unsigned int b = 0;

    cout << "Enter a number to convert to binary: ";
    cin  >> a;
    cout << "Enter a number to convert to binary: ";
    cin  >> b;

    cout << "A = " << BinaryToDecimal(a) << endl;
    cout << "B = " << BinaryToDecimal(b) << endl;

    unsigned int c = a & b;
    unsigned int d = a | b;
    //unsigned int e = ~a;
    //unsigned int f = ~b;
    unsigned int g = a ^ b;
    unsigned int h = a << 2;
    unsigned int i = b >> 3;

    cout << "A & B  = " << BinaryToDecimal(c) << endl;
    cout << "A | B  = " << BinaryToDecimal(d) << endl;
    //cout << "~A     = " << BinaryToDecimal(e) << endl;
    //cout << "~B     = " << BinaryToDecimal(f) << endl;
    cout << "A ^ B  = " << BinaryToDecimal(g) << endl;
    cout << "A << 2 = " << BinaryToDecimal(h) << endl;
    cout << "B >> 3 = " << BinaryToDecimal(i) << endl;
}
4

2 に答える 2

2

小さな符号なし整数に対してバイナリNOTを実行すると、結果として大きな数値が得られます。これは、最上位ビットのほとんどが1(オペランドにあったものの逆)に設定されるためです。

この場合~ 0、すべてのビットが1に設定されるため、実際には最大のunsigned intである、確かに大きな数が得られます。

(どのような結果を期待していましたか?)

于 2012-11-06T08:21:20.797 に答える
0

unsigned intMSBから始まる1を先導するため、少数の反転が多数になるような操作にを使用しています。表現を8ビットのみにしたい場合はunsigned char、そのストレージに使用する必要があります。
ただし、aまたはbをに変更することはできませんunsigned char。それ以外の場合は、数値ではなく、cin >> a数値のASCIIコードをに配置しaます。たとえば、入力が5の場合、5ではなく0x35( '5')になります。

コードを変更したくない場合はunsigned int、いくつかのマイナーな拡張を行うことができます

string BinaryToDecimal(unsigned int dec)
{
    string binary   = "";
    float remainder = 0.0f;

    dec &= 0xff;        // only 8 bits you care about
    while( dec != 0 )
    {
        ....

しかし、あなたwhile( dec !=0 )はバグのあるを使用しています。結果がすでに0の場合、関数は「0000」ではなく空の文字列を返します。代わりに、8ビットのみをカウントするためにカウンターを使用する必要があります。

    for (int i = 0; i < 8; i++ ) {
        if ((dec & 1) != 0)
            binary.append("1");
        else
            binary.append("0");
        dec >>= 1;
    }

また、ビットごとにビットANDをテストするために使用するのは0または1であり、シフト演算は/および%演算子よりも優れています。

最後に、8ビット5(0000_0101)の場合、その反転は1010ではなく250(1111_1010)です。

于 2012-11-06T09:03:58.450 に答える