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

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

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

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

Q&A

解決済

4回答

575閲覧

ビットベクトルについて

dokodoko486

総合スコア25

C

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

0グッド

1クリップ

投稿2018/04/28 09:48

C言語初心者です。ビットベクトルを勉強しています。
[0,1,0,0,0,0,1,0,1,...]のような0と1が並んだデータ構造があるとします。
もし、32ビットの領域があれば、32個の0と1の並びを表すことができますよね。
よって、int型の配列a[128]を用意すると、4096個の0と1の並びを表現することができます。

そこで、配列a[128]のnビット番目にビットをたてたあと、その数字を2進数で出力するプログラムをかこうと思いました。以下は配列a[128]のnビット目にビットをたてるところまでかいたプログラムです。最初の配列a[128]の値と、nはscanfで読み込みます。

C

1void set(int n, int a[128]){ 2if(n<=31){ 3a[0]=a[0]|(n<<1); 4} 5else 6unsigned int p=n/32; 7unsigned int q=n%32; 8a[p]=a[p]|(1<<q); 9} 10int main(){ 11 int a[128]; 12 int n; 13 scanf("%d",a); 14 scanf("%d",&n); 15 set(n,a); 16} 17

次は、配列a[128]を2進数(128桁)で表示したいのですが、どのようにかいたら良いのか分からないので、教えてほしいです。また、ここまでのプログラムでおかしな点がありましたら教えていただけるとありがたいです。宜しくお願いします。

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

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

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

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

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

guest

回答4

0

AUTO変数(ローカル変数)としてa[128]を定義してますが、これだと配列の初期値は不定となります
関数の外で定義して、グローバル変数とすれば、全要素が0で初期化されるのでそのほうがよろしいんじゃないかと。

次は、配列a[128]を2進数(128桁)で表示したいのですが、どのようにかいたら良いのか分からないので、教えてほしいです。

この件ですが、まず、int変数を2進数で表示できるように考えてみましょう。
それができれば、この問題も自ずと解決できるように思います

投稿2018/04/28 11:57

y_waiwai

総合スコア87747

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

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

0

Linuxでしたら/usr/include/bits/select.hにほぼ同じ機能の FD_SET, FD_CLR, FD_ISSETが定義されているので参考にする(とか、そのまま使う)のはどうでしょうか。

投稿2018/05/01 03:23

a_saitoh

総合スコア702

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

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

0

scanf("%d",a);

これでは、配列の最初 a[0] にしかデータが入りませんが、良いでしょうか?
どういう形式で入力するつもりが明示願います。

出力もどういう形式で出力したいによって対応が変わります。
rtx1950さんの回答でも出力できると思いますが、出力形式によって対応は変わります。(get() はそのまま、展開したい気分ですが)

投稿2018/04/28 14:52

pepperleaf

総合スコア6383

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

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

0

ベストアンサー

こんばんは、お世話になります。
実際にビルドして動作確認した訳では無いので、その点はご了承下さい。

set()関数ですが、2箇所誤りがあります。
(説明の都合上、インデントとコメントを追記しました。)

C

1void set(int n, int a[128]){ 2 if(n<=31){ 3 a[0]=a[0]|(n<<1); /* 1<<nとしないといけません */ 4 } 5 else /* ここに{がありません */ 6 unsigned int p=n/32; 7 unsigned int q=n%32; 8 a[p]=a[p]|(1<<q); 9}

ここは

C

1void set(int n, int a[128]){ 2 unsigned int p=n/32; 3 unsigned int q=n%32; 4 a[p]=a[p]|(1<<q); 5}

と修正しないといけないと思います。
n<=31の場合を特別扱いする必要が無いので、最初のif文を削除しました。

次は、配列a[128]を2進数(128桁)で表示したい

「4096桁」でOKでしょうか?

C

1int get(int n, int a[128]){ 2 3 unsigned int p=n/32; 4 unsigned int q=n%32; 5 return (a[p]>>q)&1; /* aのp番目の要素のqビット目を返す */ 6 7} 8void print(int a[128]) { 9 10 for(int n=(128*32-1);0<=n;n--){ 11 12 printf("%d", get(n,a)) 13 14 } 15 printf("\n") 16 17}

これで行けるはずです。

最後に、配列aは初期化しないとどんな値が入っているか分からないので、main()関数内で初期化する必要があります。
また、int型は32bitとは限りませんので、その点もご注意下さい。

投稿2018/04/28 10:23

rtr1950x

総合スコア298

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

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

rtr1950x

2018/04/28 10:28

すいません、後で気づいたので補足です。 > scanf("%d",a); この部分、a[0]の要素しか読み込めないので、修正が必要かと思います。 (for文を128回まわして、その中でscanfするとか。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問