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

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

ただいまの
回答率

90.63%

  • C

    3562questions

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

C言語を勉強中です

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 3,676

jabu

score 24

現在、独学でC言語を勉強中ですが、どうしても解らない所があります。
下記のコードで、count_bits関数を呼び出す時のreturn count_bits(~0U);の引数の
『~0U』の『U』とは何を表すのでしょうか?
また、int count_bits(unsigned x)の引数『x』に渡される値はいくつになるのでしょうか?
どなたか解説をお願いいたします。

/*
 ビット単位の論理演算
 */

#include <stdio.h>

/*--- 整数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;
}


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+7

数字の後のUは、数字が符号無し整数であることを示します。0Uは値としては0と同じです。1U1と同じ。構文上の型が違うだけ。
違いが出てくるのは、大きな数の時。intが4バイト、long intが8バイトだとすると、intで表せる数字範囲は、-2147483648から2147483647です。2147483648と書くとこれはintの範囲を超えているのでlong intつまり8バイトの定数になります。一方、unsigned intで表せる範囲は、0から4294967295なので、2147483648Uunsiged intつまり4バイトの定数になります。

~0Uは、unsiged intが4バイトなら、4バイトの全ビットゼロの1の補数(ビット反転)なので、4バイトの全ビット1、つまり0xFFFFFFFFになります。4294967295Uと同じですね。
この場合、count_bits(~0U)unsiged int型つまり4バイトのビット数つまり32を返します。
sizeof(unsigned int)*8で良いような気もしますが、1バイトが8ビットで無い環境の考慮ですかね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/03/03 02:28

    早速のご回答ありがとうございます。
    とてもわかりやすい回答でした!!

    キャンセル

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

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

関連した質問

  • 解決済

    while文のなかにif文

    その名の通りwhile文のなかにif文が入っているコードがあったのですが なんだか違和感を感じました。while文の中にif文をいれることってけっこうありますか? 詳しいかた教えて

  • 解決済

    ifの適用範囲

    ifの波括弧はputcharも含んでいると思うのですが、なぜpucharはifに縛られないのでしょうか? ’#include<stdio.h>  int main(void){

  • 受付中

    点数別分布グラフ

    点数分布のグラフですが、少し長いように感じました。もう少し短くすることはできますか? またこのコードに対して何かご意見がありましたらお願いします。 #inc

  • 解決済

    ビット構成を表示するプログラム

    すいませんputcharx>>iではなく1になっていたのが原因でした。 putchar(((x>>i)&1U)?'1':'0');の部分がよく理解できません。 例えば55という数字

  • 解決済

    文字列strの中に、文字cが含まれている個数

    文字列strの中に、文字cが含まれている個数(含まれていなければ0とする)を返すという問題でした。 自分でコードを書いてみたのですが、 どこかに問題があるみたいで、問題点を指摘し

  • 解決済

    【C言語】スタックをリストで実現するプログラム

    毎度お世話になっております。 高橋麻奈さんの「やさしいC アルゴリズム」をみて勉強しているのですが、リストを使ったスタックのコードで、がコンパイルエラーになってしまいました。 コ

  • 解決済

    コードを見てダメ出しや指摘などお願いします。

    #include <stdio.h> int main(void){     double a;     double b;        char o;  //演算子    

  • 受付中

    C言語 ビット単位の論理演算

    このコードの内容が全くもって理解できません。 どなたか一から説明してくだされば幸いです。 include<stdio.h>はこの質問のテンプレートではおかしくなるので省略し

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

  • C

    3562questions

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