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

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

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

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

Q&A

解決済

4回答

1733閲覧

C言語のわからないところがあります

main

総合スコア10

C

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

0グッド

0クリップ

投稿2016/03/04 04:21

編集2016/03/04 07:02

unsigned int data01 = 12345;//符号なしで宣言
ビットをカウントする

上のとおりに上のデータでビットをカウントさせたいです。

実行例
data=12345
16進数表記 = 3039[h]
2進数表記 = 0011 0000 0011 1001[b]
1のビットの合計は六個です

このように作りたいです。誰か教えてください

失礼しました補足です。私の考えでは
const int bin[] = {
0, 1, 10, 11,
100, 101, 110, 111,
1000, 1001, 1010, 1011,
1100, 1101, 1110, 1111,
};
int n = data01;
int a = data01;
printf("data= %d\n", a);
printf("16進数表記=%4x[h]\n2進数表記=%04d %04d %04d %04d[b]\n", n,
bin[n >> 12 & 0xf], bin[n >> 8 & 0xf], bin[n >> 4 & 0xf], bin[n & 0xf]);
printf("\n");
int count;
count=6;
printf("1ビットの合計は%d個です\n", count);

のようになりましたが、カウントがデータが入っていないため、違うデータをカウントするときに数が変わりません。合計6のところは
0011 0000 0011 1001
2進数の1の数を数えたのがそうらしいです。どうすれば、カウントできるようになるか教えてくれませんか

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

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

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

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

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

otn

2016/03/04 04:27

どのあたりが分からないのでしょうか?
k1000

2016/03/04 04:27

回答していないのにこういうことを言うのもなんですが、文書のタイトルをもう少し具体的に――たとえばこの件なら「十進数の値を十六進や二進で表示したい/二進数にしたときの1を数えたい」などにしていただければと思います。
ogaaaan

2016/03/04 04:37

そうそう、わからないからteratailをつかうわけだから、タイトルに「わからないところがある」だけだと意味がないですよ。
guest

回答4

0

ベストアンサー

2進数の1の数を数えたのがそうらしいです。

何かを参考にしてこれを書いているんでしょうか?

1のビットの数え方ですが、検索すればサンプルコードがたくさん出てくると思いますが、配列に8ビットごとの1のビットの数を数えたものを予め入れておく方法が簡単なので紹介します。(参考:ビットを数える・探すアルゴリズム)

C

1const int BITS_COUNT_TABLE[256] = { 2 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 3 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 4 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 5 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 6 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 7 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 8 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 9 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 10 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 11 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 12 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 13 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 14 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 15 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 16 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 17 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, 18}; 19 20int numofbits(int bits) 21{ 22 int num = 0; 23 int i; 24 25 for (i=0 ; bits > 0 ; i++ ) { 26 num += BITS_COUNT_TABLE[bits & 0xff]; 27 bits = bits >> 8; 28 } 29 30 return num; 31}

投稿2016/03/08 08:02

akamakku

総合スコア191

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

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

main

2016/06/23 20:28

有難う御座いました。皆さんのわかりやすい説明で無事解決できました!
guest

0

先の方が答えられているように、ビット演算を使えば、指定したビットが0か1のどちらなのかわかります。
あとは、検査するビットをシフトしながら検査するビット数分ループを回せばカウントができます。
8ビット分を検査する部分だけ書いておきますので後は検査するビット数に応じて拡張してください。

C

1int cnt; 2int i; 3unsigned int pat; 4 5pat = 0x01; 6cnt = 0; 7for(i = 0; i < 8; i++, pat <<= 1) { 8 if (data & pat) { 9 cnt++; 10 } 11}

投稿2016/03/04 08:11

PineMatsu

総合スコア3579

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

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

0

16進表記はprintfで%xでいいです。
2進表記はないですね。自作になります。
sprintfで16進にしてから変換してもいいし、
2で1個づつ割りながら余りを表記してもいいでしょう。

投稿2016/03/04 05:53

maiko0318

総合スコア876

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

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

0

考え方だけ書いておきます。
ビットがオンかオフかを取得するには論理積(AND)を使います。

C

10x00003039 & 0x00000001

これで1ビット目の値が取得できます。
わかりやすく書くとこうです。

0011 0000 0011 1001
0000 0000 0000 0001
-----------
0000 0000 0000 0001

あとはわかりますね。

投稿2016/03/04 04:35

ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問