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

您似乎正在输入数字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)

以上是您使用的数字的二进制表示,分为四位组,因此更易于阅读。

于 2011-06-06T01:44:05.263 回答
3

对于您的最后一个问题:

我的其他问题是,有时它会输出一些奇怪的数字,例如 110010 & 010101 = 110591 为什么会这样

你写的这个符号很奇怪。第一个数字被视为小数。第二个数字“010101”被视为八进制数,因为它带有“0”。当显示为整数时,您选择的数字的输出应为 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中; a = b || c;将执行逻辑运算并将其存储到a中;

a = b & c;将执行按位运算并将其存储到a中; a = b | c;将执行按位运算并将其存储到a中;

例子 :

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

对于问题 - 如何输入二进制数而不是十进制数。

您可以将它们读取为字符串,然后假设它们是基数 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

如果你想要二进制运算,你的输入必须是二进制的,而不是十进制或八进制。

不幸的是,C 和 C++ 似乎不支持二进制文字。一些编译器允许您使用 '0b' 前缀来执行它们,所以110010 & 010101会这样写0b110010 & 0b010101,但显然这不是可移植的。

一种选择是使用std::bitset,它允许您输入二进制数作为字符串。

但是,鉴于您已经注意到这是家庭作业,我希望 std::bitset 不是您应该提供的答案,并且可以使用 & 和 | 一般。您看到问题的唯一原因是您以十进制和八进制格式输入二进制数 - 如果您以一种格式输入和操作所有数字,那么就不会有问题。

于 2011-06-06T01:49:49.870 回答