我无法打印按位运算符的结果

时间:2013-01-01 13:13:02

标签: c bitwise-operators

  

可能重复:
  Can I use a binary literal in C or 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;
}

谢谢

3 个答案:

答案 0 :(得分:8)

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

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

或者对于GCC编译器使用:

unsigned a = 0b101101;
unsigned b = 0b110011;

答案 1 :(得分:1)

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

有些编译器可能支持二进制文件,但大多数编译器都不支持。一旦数字长度超过8-12位,直接使用二进制文件就会很痛苦,所以学习如何使用十六进制(这些日子最常见)或八进制(以前在二十世纪七十年代流行,特别是在DEC设备上)使用二进制文件使用了很多3位组合,所以它有意义)。

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

答案 2 :(得分:1)

您定义的整数(a和b)未使用位定义。你已经定义了101101和110011的整数。所以即使有适当的显示,这也行不通。

我建议你或多或少地得到你想要的东西:

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

unsigned a = 0b101101;

unsigned b = 0b110011;

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

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

输出:c: 0x21