1

以前の質問を参照して、C++ で AND および OR 操作を実装するにはどうすればよいですか

次の質問は、たとえば 110010 & 010101 = 110591 のような奇妙な数字を出力することがあります。

#include <iostream>
#include <iomanip>

using namespace std;

int main ()
{
    long int s;
    long int l;
    long int r;

    cin>>s;
    cout<<endl;
    cin>>l;
    cout<<setfill('0')<<setw (5)<<s<<endl<<setfill('0')<<setw (5)<<l<<endl;
    r=s|l;
    cout<<r<<endl;
    return 0;
}
4

6 に答える 6

6

数値を入力しているように見えますが、1100101 と 0 しかないため、それが 2 進数であることを期待しています。その数値は10 進数であり、ビット演算が意味をなすように 2数に変換する必要があります。

 decimal                    binary
 ---------------------------------
 110010 = 0001 1010 1101 1011 1010
 010101 = 0000 0010 0111 0111 0101
 ---------------------------------
 110591 = 0001 1010 1111 1111 1111 (result of a | b)

上記は、使用している数値のバイナリ表現であり、読みやすいように 4 ビットのグループに分割されています。

于 2011-06-06T01:44:05.263 に答える
3

最後の質問について:

私の他の質問は、時々それはいくつかの奇妙な数を出力します例えば110010&010101=110591なぜそれが起こるのですか

あなたが書いたこの表記は奇妙です。最初の数値は小数として扱われます。2番目の「010101」は「0」であるため8進数として扱われます。整数として表示するときに選択した数値の出力は0である必要があります。

そうは言っても、あなたはあなたの記法が正しいと確信していますか?また、ビット単位の&を実行する場合は、数値を具体的に指定してください。

最後に、本当にバイナリを処理する必要がある場合、一部のコンパイラは「0b」表記を許可します。他の人にとっては、HEXの使用に非常に満足しています。つまり「0x」

それが役に立てば幸い。乾杯!

于 2011-06-06T01:35:58.307 に答える
2

std::bitset を使用して、ストリームからバイナリ値を取得します。

#include <iostream>
#include <bitset>

int main() 
{
    std::bitset<8>  val1;
    std::bitset<8>  val2;

    std::cin >> val1 >> val2;

    std::cout << val1 << " = " << val1.to_ulong() << "\n";
    std::cout << val2 << " = " << val2.to_ulong() << "\n";
    std::cout << "\n\n";

    std::cout << (val1 | val2) << " = " << (val1.to_ulong() | val2.to_ulong()) << "\n";

}

ランニング:

> g++ t.cpp
> ./a.out
110010
010101
00110010 = 50
00010101 = 21


00110111 = 55
于 2011-06-06T03:03:32.363 に答える
1

a = b && c;論理積演算を実行し、それを;に格納します。 a = b || c;論理和または演算を実行し、それを;に格納します。

a = b & c;ビットごとに実行して操作し、;に格納します。 a = b | c;ビット単位または演算を実行し、それを;に格納します。

例:

11 && 10 = 01
10 && 01 = 01
00 && 11 = 00

11 || 10 = 01
10 || 01 = 01
00 || 11 = 01

11  & 10 = 10
10  & 01 = 00
00  & 11 = 00

11  | 10 = 11
10  | 01 = 11
00  | 11 = 11
于 2011-06-06T01:28:03.830 に答える
1

質問について - 10 進数ではなく 2 進数を入力する方法。

それらを文字列として読み取り、基数 2 であると仮定して変換できます。

したがって、次のようなコード (テストされていません!):

std::string s_str;

cin >> s_str;
...
// now convert as if it's a binary string, thats what the last arg following does
s = strtol(s_str.c_str(), 0, 2);
于 2011-06-06T02:07:34.697 に答える
0

二項演算が必要な場合、入力は 10 進数や 8 進数ではなく、2 進数でなければなりません。

残念ながら、C と C++ はバイナリ リテラルをサポートしていないようです。一部のコンパイラでは、「0b」プレフィックスを使用して実行110010 & 010101できるため、 と記述されますが0b110010 & 0b010101、明らかに移植性がありません。

1 つのオプションは、std::bitsetを使用することです。これにより、2 進数を文字列として入力できます。

ただし、これが宿題であることに気付いたので、 std::bitset はあなたが提供することが期待されている答えではなく、 & と | を使用するだけでよいと思います。通常は。問題が発生する唯一の理由は、2 進数を 10 進数と 8 進数の形式で入力するためです。数値をすべて 1 つの形式で入力して操作する場合、問題はありません。

于 2011-06-06T01:49:49.870 に答える