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

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

ただいまの
回答率

90.38%

  • C

    4811questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 847

main

score 3

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の数を数えたのがそうらしいです。どうすれば、カウントできるようになるか教えてくれませんか

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2016/03/04 13:27

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

    キャンセル

  • k1000

    2016/03/04 13:27

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

    キャンセル

  • ogaaaan

    2016/03/04 13:37

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

    キャンセル

回答 4

checkベストアンサー

0

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

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

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

const int BITS_COUNT_TABLE[256] = {
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};

int numofbits(int bits)
{
    int num  = 0;
    int i;

    for (i=0 ; bits > 0 ; i++ ) {
        num += BITS_COUNT_TABLE[bits & 0xff];
        bits = bits >> 8;
    }

    return num;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/24 05:28

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

    キャンセル

0

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

0x00003039 & 0x00000001


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

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

あとはわかりますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

int cnt;
int i;
unsigned int pat;

pat = 0x01;
cnt = 0;
for(i = 0; i < 8; i++, pat <<= 1) {
    if (data & pat) {
        cnt++;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4811questions

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