3

可能重复:
我可以在 C 或 C++ 中使用二进制文字吗?

我无法在 C 中显示按位运算符的结果。在下面的代码中,a&b 应该是 100001 和 a|b 111111。但是,打印的结果是不同的。我试图在有和没有 itoa 的情况下做到这一点,但无济于事。为什么程序不能正确打印答案?

#include<stdio.h>
#include<stdlib.h>

int main (int argc, char* argv[]) {

  unsigned a = 101101;
  unsigned b = 110011;

  unsigned c = a&b;
  unsigned d = a|b;

  char s[100];
  char t[100];

  itoa(c,s,2);
  itoa(d,t,2);

  printf("%s\n",s); /* Shouldn't it produce 100001? 
                       Instead I get 11000100010101001*/
  printf("%s\n",t); /* Ought to print 111111.
                       Instead it prints 11010111111111111 */

  return 0;
}

谢谢你

4

3 回答 3

8

您提供的数字是十进制的,而您打算使用二进制。尝试以下操作:

unsigned a = 0x2d; // 101101 b
unsigned b = 0x33; // 110011 b

或者对于 GCC 编译器使用:

unsigned a = 0b101101;
unsigned b = 0b110011;
于 2013-01-01T13:15:54.437 回答
1

您需要将数字表示为十进制(例如,101101 变为 45,110011 变为 51)、八进制(101101 变为 055,110011 为 063)或十六进制(如 Eli 所示,分别为 0x2d 和 0x33)。

一些编译器可能支持二进制,但大多数不支持。一旦数字长度超过 8-12 位,直接用二进制工作是很痛苦的,所以学习如何使用十六进制(现在最常见)或八进制(过去在 1970 年代流行,特别是在 DEC 设备上)的二进制使用了很多 3 位组合,所以这是有道理的)。

您当然可以使用strtol(str, NULL, 2)将二进制字符串转换为长值。

于 2013-01-01T13:23:28.757 回答
1

您定义的整数(a 和 b)不是使用位定义的。您已经定义了 101101 和 110011 的整数。所以即使显示正确,这也行不通。

我建议你或多或少得到你想要的是:

首先正确定义您的号码。一些 C 编译器(据我所知,这不是标准的)定义了位符号,所以 a 将是:0b101101,b 将是 b:0b110011。那样:

unsigned a = 0b101101;

unsigned b = 0b110011;

否则,您必须使用十六进制表示法 (0x....) 或直接以 10 进制定义它们。在第一种情况下,a 将是:0x2d 或 45。

此外,对于显示,您无法显示位。因此,您应该使用十六进制表示法(更适合这种情况)显示:printf("c: %#x", c);

它将输出:c: 0x21

于 2013-01-01T13:25:36.287 回答