質問編集履歴

1 コードブロックでコードを囲いました。わからないところを初心者理に明確化しました。

退会済みユーザー

退会済みユーザー

2016/07/04 23:56  投稿

C言語 ビット単位の論理演算
このコードの内容が全くもって理解できません。
どなたか一から説明してくだされば幸いです。
include<stdio.h>はこの質問のテンプレートではおかしくなるので省略しています。
int count_bits  
int_bits  
void_print_bits  
/*
ビット単位の論理演算
*/
これらの関数の内部で何が行われているのかがよくわからないです。
ビット単位の論理演算自体の結果はわかるのですが、それをどうやって演算しているのか?がわかりません。
```
/*--- 整数x中のセットされたビット数を返す ---*/
 
/*--- 整数x中のセットされたビット数を返す ---*/  
int count_bits(unsigned x)
{
   int bits = 0;
   while (x) {
       if (x & 1U) bits++;
       x >>= 1;
   }
   return bits;
}
/*--- unsigned型のビット数を返す ---*/
int int_bits(void)
{
   return count_bits(~0U);
}
/*--- unsigned型のビット内容を表示 ---*/
void print_bits(unsigned x)
{
   int i;
   for (i = int_bits() - 1; i >= 0; i--)
       putchar(((x >> i) & 1U) ? '1' : '0');
}
int main(void)
{
   unsigned a, b;
   
   printf("非負の整数を二つ入力してください。¥n");
   printf("a : ");  scanf("%u", &a);
   printf("b : ");  scanf("%u", &b);
   
   printf("\na    = ");  print_bits(a);
   printf("\nb    = ");  print_bits(b);
   printf("\na & b = ");  print_bits(a & b);       /* aとbの論理積 */
   printf("\na | b = ");  print_bits(a | b);       /* aとbの論理和 */
   printf("\na ^ b = ");  print_bits(a ^ b);       /* aとbの排他的論理和 */
   printf("\n~a   = ");  print_bits(~a);           /* aの1の補数 */
   printf("\n~b   = ");  print_bits(~b);           /* bの1の補数 */
   putchar('\n');
   
   return 0;
}
}
```
  • C

    4831 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る