今、ビットについて勉強しているのですが、わからないところがありますので、質問しました。わかる方がいれば、わかりやすく教えてください。(例として、整数xは10とした場合をしてもらえる助かります。)
int count_bits(unsigned x){
int count = 0;
while (x){
if (x & 1U) count++; x >>= 1;
}
return (count);
}
int int_bits(void){
return (count_bits(~0U));
}
void print_bits(unsigned x){
int i;
for ( i = int_bits() - 1 ; i >= 0; i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}
以上
まず、
int count_bits(unsigned x){
int count = 0;
while (x){
if (x & 1U) count++; x >>= 1;
}
return (count);
}
についてですが、整数Xを10とした場合、私の考えではcount=2となると思うのですが・・・。
次に
int int_bits(void){
return (count_bits(~0U));
}
についてなのですが、count_bits関数で整数Xを10とした場合count=2となったあと、int_bits関数では全ビットを1にするということみたいですが、count_bits関数でおこなった作業をどうint_bits関数で処理するのかわかりません。
最後が
for文の中の、(i = int_bits() - 1 ; i >= 0; i--)
についてですが、整数10のときの i = int_bits() はどうなっているのでしょうか??
わかりにくい質問ですみません。
回答宜しくお願いします。
No.2ベストアンサー
- 回答日時:
>整数Xを10とした場合、私の考えではcount=2となると思うのです
>が・・・。
10(10進)=1010(2進)ですから
1010:0+0=0
101:0+1=1
10:1+0=1
1:1+1=2
2で合っています。
>count_bits関数で整数Xを10とした場合count=2となったあと…
xが 0 になるまでの右シフト数を求めた後
void print_bits(unsigned x){
int i;
for ( i = int_bits() - 1 ; i >= 0; i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}
を呼び出し、xのすべての桁を表示するために
マスクビット(すべて1)を用意しその回数を求めれば
全桁数が求まります。
例えば8ビットであれば、x=10の時、i=(1111111の桁数8)-1=7 で、
00001010 を 7ビット右へシフト時の1ビット目=0※、i=7-1=6
・
・
00001010 を 3ビット右へシフト時の1ビット目=1※、i=3-1=2
00001010 を 2ビット右へシフト時の1ビット目=0※、i=2-1=1
00001010 を 1ビット右へシフト時の1ビット目=1※、i=1-1=0
00001010 を 0ビット右へシフト時の1ビット目=0※
ですね。
putchar(((x >> i) & 1U) ? '1' : '0'); によって
※の、1,0 を評価してそれぞれ文字の'1'と'0’を表示します。
No.3
- 回答日時:
> のi = int_bits() の部分には32が入り、1の歩数をもとめるので、31ということになるのでしょうか?
1の補数とは無関係です。
print_bits関数は、引数で与えた数値の2進表現を左側から走査して、
ビットが立っているorいないを出力する関数です。
お使いの環境が32ビットであるならば、
右から数えて31ビット目~0ビット目の順に、
つまりいちばん左のビットからいちばん右のビットへ向かって
走査するようになっています。
No.1
- 回答日時:
count_bits関数は、引数で渡した数値を2進数で表わしたときに、
いくつ'1'ビットが立っているかを返す関数です。
したがって、
> についてですが、整数Xを10とした場合、私の考えではcount=2となると思うのですが・・・。
10進数の10を2進数で表わすと1010ですので、2が返ってくるとの
お考えは正しいです。やってみればすぐわかりますよね。
int_bits関数は、お使いの環境では整数を何ビットで
表わしているかを返す関数です。
そのために、count_bit関数に~0U、つまりすべてのビットが'1'であるような
値を渡しています。
10の場合とは切り離して考えてください。
> 整数10のときの i = int_bits() はどうなっているのでしょうか??
これも、10の場合とは切り離して考えてください。
この回答への補足
回答ありがとうございます。わかってきました。
ということは、
int int_bits(void){
return (count_bits(~0U));
}
についてですが、私の環境では32ビットなので32ということですね。
そうすると、
void print_bits(unsigned x){
int i;
for ( i = int_bits() - 1 ; i >= 0; i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}
のi = int_bits() の部分には32が入り、1の歩数をもとめるので、31ということになるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
intとlongは同じ?
-
2の補数を計算するプログラム
-
分数の足し算をさせるプログラ...
-
C言語で%を使わない余りの出し方
-
再起呼び出しの回数をカウント...
-
C言語のプログラムについて(...
-
argvのNULLチェック
-
複数の共有メモリの作成
-
コマンドプロンプトのウィンド...
-
直線補間について
-
異なるn個の整数からr個の整数...
-
条件が多い場合
-
DXライブラリによるパズルゲー...
-
3のつく数と3の倍数を表示 C言語
-
迷路を脱出する経路探索プログ...
-
C#で疑似カラー
-
円周にアンチエイリアスをかける
-
乱数生成について
-
C++ Debug Errorについて教えて
-
returnの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報