2011-06-06 74 views
1

参照我刚才的问题,How can i implement AND and OR operations in c++错误执行“与”和“或” 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; 
} 
+0

如果你知道他们在做什么,他们不是“怪异的数字”;) – Marlon 2011-06-06 01:32:08

+1

请发布你使用的代码,因为这些数字没有意义。对于正数* x *和* y *,* z * = * x *&* y *,* z *不能大于* x *且* z *不能大于* y *。 – 2011-06-06 01:33:33

+0

// setw example #include #include using namespace std; int main(){ long int s; long int l; long int r; cin >> s; cout << endl; cin >> l; (5)<< s << endl << setfill('0')<< setw(5)<< l << endl; r = s | l; cout << r << endl; return 0; } – Shadi 2011-06-06 01:36:06

回答

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); 
+0

我向上帝最好的回答,只有11代表。上帝保佑“你”的人 – Shadi 2011-06-06 02:14:13

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 
+0

所以,而不是使用a = b&c我使用a = b && c和相同的为“或” – Shadi 2011-06-06 01:29:27

+1

如果你只是想检查真假之间是的 – Ali1S232 2011-06-06 01:31:22

+0

不,不,我不想让a = b&c给我不是真的或假的,但实际按位操作,但它有时有效,但有时给我一个错误,如问题 – Shadi 2011-06-06 01:33:26

3

对于你最后的问题:

我的其他问题是,,有时 输出例如 010101 = 110591一些奇怪的数字为什么是 发生

这个表示法,我写的是奇怪的。第一个数字被视为小数。 '010101'的第二个数字被视为一个八进制数字,因为它是'0'。对于显示为整数的数字,输出应为0。

这就是说,你确定你的符号是正确的吗?此外,当你想做一个比特明智的&时,要非常具体地使用数字。最后,如果你真的需要处理二进制,一些编译器允许'0b'表示法。对于其他人,我们非常喜欢使用HEX,例如:'0x'

希望它有帮助。干杯!

+0

我只想使用按位运算“&”和“|”我不想要ocatal或其他什么我怎么修复它? – Shadi 2011-06-06 01:37:55

+0

@Shadi:为什么不呢?使用什么数字表示并不重要,按位操作仅对位使用。例如,'255','0377'和'0xff'都表示相同的数字。 '120&43'为您提供与0x78&0x2b完全相同的值。使用十六进制表示法是因为十六进制和二进制之间的对应关系更加明显。 – 2011-06-06 01:48:49

+0

@Shadi:是的,我同意在硅片上。他是对的,大多数程序员对HEX符号'0x'非常舒服。也就是说,如果你不喜欢八进制,那么一定不要在你使用的数字前加'0'。干杯! – Vern 2011-06-06 02:59:02

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) 

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

+0

是的,所以你说我输入的数字是十进制数字不是二进制,,这就是为什么我得到一个错误,我怎么能代表它们在二进制,所以我可以得到正确的答案 – Shadi 2011-06-06 01:46:57

+1

你可以将所需的值转换为十进制,然后键入它们in。'110010 = 50'和'010101 = 21'。 '50 | 21 = 55',或'110111'二进制。用十六进制/十进制/二进制转换得到一个好的计算器,这将变得更容易。 – 2011-06-06 01:49:43

+0

ahhh ,,现在事情更清晰了,我怎么能在没有任何计算器的情况下在C++中执行这个操作? – Shadi 2011-06-06 01:52:52

0

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

不幸的是,C和C++似乎不支持二进制文字。一些编译器让你用'0b'做前缀,所以110010 & 010101会写成0b110010 & 0b010101,但显然这不是可移植的。

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

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

+0

我可以使用std :: bitset,但是如果我不能如何操作数字以便我可以得到写入答案 – Shadi 2011-06-06 01:56:20

+0

如果您的任务如另一个问题所示,“实现MIPS处理器”,那么在没有点你需要以字符串的二进制形式存储一个数字。 – Kylotan 2011-06-06 12:31:38

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 
从流中获取二进制值