🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

5回答

1221閲覧

2進数に変換した時の1bitの総数、奇数偶数

XYZNo.00

総合スコア5

C

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

0グッド

1クリップ

投稿2019/12/20 06:40

編集2019/12/20 07:31

数を入力してその数を2進数に変換したときの1bitの総数が奇数の時は1で、偶数がの時は2で返すプログラムを作ってみたのですがうまくいきません。教えて下さい。
答えが次の実行時の結果です。

input n:10
整数10の1bitの総数は偶数です。

c言語

1コード

#include <stdio.h>

int parity(int n){
if(n%2==0){

} else{ } return n;

}

int main(){
int n;
printf("input n:");
scanf("%d",&n);

printf("整数%dの1bitの総数は%dです。¥"n,parity(n));

}

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

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

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

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

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

otn

2019/12/20 06:56

コードと実行結果が合いません。 また、このコードのどこで「2進数に変換したときの1bitの総数」を求めているつもりですか? コピペするコードを間違えたのでは?
XYZNo.00

2019/12/20 07:29

すみません、間違えました!
退会済みユーザー

退会済みユーザー

2019/12/20 08:46

コード頑張って直して!
majiponi

2019/12/20 09:43

CPUはx86系列のものですか?
guest

回答5

0

質問に書いてあるのに無理やりはめ込んでみました。まぁ、普通こんなことはしないと思いますが。
main関数は自分で適宜修正して下さい。処理の意味に対して「整数%dの1bitの総数は%dです。」という言葉は不適切だと思います...

C

1int parity(int n) { 2 if (n % 2 == 0) { 3 if (n != 0) { 4 n = parity(n / 2); 5 } else { 6 n = 2; 7 } 8 } else { 9 n = (3 * ( n % 2 ) ) ^ parity( n / 2 ) ; 10 } 11 return n; 12}

Xor'^'がわかりにくければ、n = (3 * ( n % 2 ) ) ^ parity( n / 2 )はこの場合は

if( parity( n / 2 ) == 2){ n = 1; } else { n = 2; }

とかでも動きは同じですのでよしなに。

n%2で分岐しているのがなんとも扱いにくいですね。再帰の使い所でもないと思いますが、再帰でやるならせめてこんな感じでしょうか。

C

1int parity(int n){ 2 int ret; //変数を理由もなく再利用しない。戻り値用変数を設ける 3 if(n != 0){ 4 ret = (3 * ( n % 2 ) ) ^ parity( n / 2 ) ; 5 }else{ 6 ret = 2; 7 } 8 return ret; 9}

投稿2019/12/21 00:14

編集2019/12/21 00:52
thkana

総合スコア7703

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

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

0

C

1#include <stdio.h> 2#include <stdint.h> 3 4int parity(int32_t bits) 5{ 6 bits ^= bits >> 16; 7 bits ^= bits >> 8; 8 bits ^= bits >> 4; 9 bits ^= bits >> 2; 10 bits ^= bits >> 1; 11 return 2 - (bits & 0b1); 12} 13 14int main(void) { 15 for(int i=0;i<10;i++){ 16 printf("%d: %d\n",i, parity(i)); 17 } 18 return 0; 19}

投稿2019/12/20 09:30

ozwk

総合スコア13551

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

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

0

C

1int parity(int n) { 2 int numOfBits = 0; 3 4 while(n) { 5 ++numOfBits; 6 n &= n-1; 7 } 8 9 return (numOfBits & 1) ? 1 : 2; 10}

投稿2019/12/20 20:36

Bearded-Ockham

総合スコア430

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

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

0

C

1int parity(int n) { return n ? 3 - parity(n-1 & n) : 2; }

投稿2019/12/21 02:39

kazuma-s

総合スコア8224

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

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

0

各bitについて1である場合にカウントを増やせばいいのでビット演算を使いましょう。
例えば対象が1101のとき、0001と&をとると0001に、0010と&をとると0000になります。
では0001,0010,0100,1000 といった具合に順に調べるにはどうしたら良いでしょうか?
ビットシフトという言葉を調べてみて下さい。

実際の対象は多分int型だと思いますので、bit数にお気をつけ下さい。

投稿2019/12/20 08:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/12/21 03:49 編集

他の方の回答の方がエレガントだけど伝わるかなあれ・・・段々大喜利みたいになってきてる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問