Ошибка реализации «И» и «ИЛИ» в C ++ - PullRequest
1 голос
/ 06 июня 2011

Со ссылкой на мой предыдущий вопрос, Как я могу реализовать операции И и ИЛИ в c ++

Мой следующий вопрос: иногда он выводит некоторые странные числа, например 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;
}

Ответы [ 6 ]

6 голосов
/ 06 июня 2011

Вы, кажется, набираете число 110010 и ожидаете, что оно будет в двоичном формате, потому что оно имеет только 1 и 0. Это число является десятичным числом, и вам нужно преобразовать его в двоичный файл, чтобы побитовые операции имели смысл.

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

Выше приведено двоичное представление используемых вами чисел, разделенных на группы по четыре бита, чтобы их было легче читать.

3 голосов
/ 06 июня 2011

Для ваших последних вопросов:

Другие мои вопросы: «Иногда выводятся странные числа, например 110010 & 010101 = 110591 Почему это происходит

запись, которую вы написали, странная.1-е число считается десятичным.2-е число, которое является «010101», рассматривается как восьмеричное число, поскольку оно имеет «0».Выходные данные должны быть 0 для чисел, которые вы выбрали при отображении в виде целого числа.

При этом, вы уверены, что вы правильно поняли свои записи?Кроме того, будьте очень точны с числами, когда вы хотите сделать что-то побитовое &.

Наконец, если вам действительно нужно иметь дело с двоичным кодом, некоторые компиляторы допускают нотацию '0b'.Для других, нам действительно удобно использовать HEX, то есть: '0x'

Надеюсь, это поможет.Ура! * * 1013

2 голосов
/ 06 июня 2011

Используйте 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
1 голос
/ 06 июня 2011

На вопрос - как вводить двоичные числа вместо десятичных.

Вы можете прочитать их как строки, а затем преобразовать их, предполагая, что они являются базовыми 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);
1 голос
/ 06 июня 2011

a = b && c; преформирует логическую операцию и и сохраняет ее в; a = b || c; преформирует логическую операцию или и сохраняет ее в;

a = b & c; преобразует поразрядно и и сохраняет ее в a; 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
0 голосов
/ 06 июня 2011

Если вы хотите двоичные операции, ваши входные данные должны быть двоичными, а не десятичными или восьмеричными.

К сожалению, C и C ++ не поддерживают двоичные литералы. Некоторые компиляторы позволяют вам делать это с префиксом '0b', поэтому 110010 & 010101 будет написано 0b110010 & 0b010101, но, очевидно, это не переносимо.

Один из вариантов - использовать std :: bitset , который позволяет вводить двоичное число в виде строки.

Однако, учитывая, что вы заметили, что это домашняя работа, я ожидаю, что std :: bitset не тот ответ, который вы должны предоставить, и он может просто использовать & и | обычно. Единственная причина, по которой вы видите проблему, заключается в том, что вы вводите двоичные числа в десятичном и восьмеричном формате - если вы вводите числа в одном формате и манипулируете ими, проблем не будет.

...