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

提供する数値は10進数ですが、2進数を使用することを意図しています。次のことを試してください。

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

または、GCCコンパイラの使用:

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

数値は、10進数(たとえば、101101が45、110011が51)、ocatal(101101が055、110011が063)、または16進数(Eliが示すように、それぞれ0x2dと0x33)で表す必要があります。

一部のコンパイラはバイナリをサポートする場合がありますが、ほとんどはサポートしません。数値が約8〜12ビットの長さになると、バイナリで直接作業するのはとにかく苦痛です。そのため、16進数(最近最も一般的)または8進数(1970年代、特にDEC機器で人気があった)で2進数を操作する方法を学びます。多くの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;

それ以外の場合は、16進表記(0x ....)を使用して定義するか、10進数で直接定義する必要があります。最初のケースでは、aは0x2dまたは45になります。

さらに、表示の場合、ビットを表示する方法はありません。したがって、次を使用して、16進表記(そのようなものにより適しています)で表示する必要があります。printf("c: %#x", c);

次のように出力されますc: 0x21

于 2013-01-01T13:25:36.287 に答える