質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

2回答

875閲覧

ビット単位の論理演算を実現したい

takilice

総合スコア4

C

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

0グッド

0クリップ

投稿2020/12/16 16:14

前提・実現したいこと

C言語を勉強し始めて2週間程度のため、ほとんど初心者です。
2つの非負の整数を読み込んで、ビット単位の論理積、論理和などの演算を行った結果を表示したい。

発生している問題・エラーメッセージ

エラー文は出てきていませんが、演算の結果がおかしいです。 例) 非負の整数を2つ入力してください。 a:3 b:5 a = 11111111111111111111111111111111 b = 00000000000000000000000000000000 a & b = 00000000000000000000000000000000 a | b = 11111111111111111111111111111111 a ^ b = 11111111111111111111111111111111 ~a = 00000000000000000000000000000000 ~b = 11111111111111111111111111111111

該当のソースコード

C

1/* 2 ビット単位の論理演算 3*/ 4#include <stdio.h> 5 6/* 整数x中のセットされたビット数を返す */ 7int count_bits(unsigned x) 8{ 9 int bits = 0; 10 while (x) { 11 if (x & 1U) { 12 bits++; 13 } 14 x >>= 1; 15 } 16 17 return bits; 18} 19 20/* unsign型のビット数を返す */ 21int int_bits(void) 22{ 23 return count_bits(~0U); 24} 25 26/* unsigned型のビット内容を表示 */ 27void print_bits(unsigned x) 28{ 29 int i; 30 for (i = int_bits() - 1; i >= 0; i--) { 31 putchar(((x >> 1) & 1U) ? '1' : '0'); 32 } 33} 34 35int main(void) 36{ 37 unsigned a, b; 38 39 printf("非負の整数を2つ入力してください。\n"); 40 printf("a:"); scanf("%u", &a); 41 printf("b:"); scanf("%u", &b); 42 43 printf("\na = "); print_bits(a); 44 printf("\nb = "); print_bits(b); 45 printf("\na & b = "); print_bits(a & b); /* aとbの論理積 */ 46 printf("\na | b = "); print_bits(a | b); /* aとbの論理和 */ 47 printf("\na ^ b = "); print_bits(a ^ b); /* aとbの排他的論理和 */ 48 printf("\n~a = "); print_bits(~a); /* aの1の補数 */ 49 printf("\n~b = "); print_bits(~b); /* bの1の補数 */ 50 putchar('\n'); 51 52 return 0; 53}

試したこと

コードの確認をしましたが、誤って記述しているところは見当たりませんでした。

補足情報(FW/ツールのバージョンなど)

Vidual Studio Codeを使っています。
32bitで表示されます。
新明解C言語 入門編 p189 List7−6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

もひとつ、

for (i = int_bits() - 1; i >= 0; i--) {

やりたいことはわかりますが、ここのiの操作はちとまずい気がします

投稿2020/12/16 21:12

y_waiwai

総合スコア87782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takilice

2020/12/16 22:28

ありがとうございます。 先にiを変数として示した方が良いということでしょうか?
y_waiwai

2020/12/16 23:14

int_bits関数では、1の数をカウントしてます。 変数のビット数を求めるにはちと冗長ですね。まあ、不適切な気がする、という程度のもんですが。
takilice

2020/12/17 00:13

なるほどですね、助かります。 ありがとうございます。
guest

0

ベストアンサー

for (i = int_bits()-1; i >= 0; i--) {
putchar(((x >> 1) & 1U) ? '1' : '0');
}
が間違っているからです。
常に第2bit を表示しています。

入力ミスをしていないと思っているなら
x >> 1 は、x >> i の間違いかな?
1 と i は見間違いやすいので。

投稿2020/12/16 18:19

編集2020/12/16 19:28
PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takilice

2020/12/16 22:25

ありがとうございます。 おっしゃる通り1をiにすると上手くいきました。 初歩的な見間違いで申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問