• ベストアンサー

ビット操作

 「ビット操作を用いて素数を調べたい」です。  unsigned 型の配列bit[16]を用いてビット操作によって素数を調べたいのですが、  例えば、bit[0]からbit[1]への移動方法?を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

「エラトステネスのふるい」をビット配列でという事なのかな? unsigned bit[16]; /* unsigned は 32 ビットだとする */ void set_bit(int n) { bit[n / 32] |= 1 << (n % 32); } unsigned get_bit(int n) { return bit[n / 32] & (1 << (n % 32)); /* 戻り値は 0 か 0 以外で判定 */ } というような感じでしょうか。

maroniichann
質問者

お礼

「エラトステネスのふるい」をビット配列でという事ということです。 参考にさせてもらいます。

maroniichann
質問者

補足

 ありがとうございました。  ちゃんとできました

その他の回答 (2)

  • takebou
  • ベストアンサー率43% (27/62)
回答No.3

#1のものです。 エラトステネスのふるいですか。こういう方法もあるんですねぇ。 無知でした。ごめんなさい。

maroniichann
質問者

補足

 ありがとうございました。  ちゃんとできました。

  • takebou
  • ベストアンサー率43% (27/62)
回答No.1

ビット操作で素数? 素数って2,3,5,7,11,13・・・という数ですよね? で、それをビット操作で求めるのは無理なんじゃないかと思います。 ビット操作をするのなら、配列を使わずに、unsignedの変数1つでやったほうが楽ですよ。 unsigned bit; bit=1; bit=bit<<1; でビット0の'1'がビット1にシフトされます。

maroniichann
質問者

補足

アドバイスありがとうございます。  とり合えず自分なりの考え方を書いてみました。  実際はunsigned型の配列を用いるらしいです。  例えばkenchiが32bitであるとして考えてみました。  これを配列を用いて500までの素数を求めたいんです。  コンパイルしてないんで(家では出来ないんで)うごくかどうか、分かりませんが、配列を使うとするとどうなるのでしょうか。。 kenchi=1; for(i=2;i<=32;++i)  このループで32までの素数を求めています。 { for(sosuu=1,j=2;j<=i;++j)   { k=1<<j; if(k&kenchi) kenchiに1が入っていたら素数なので {        if(i%j) sosuu*=1;その数で割って余りがでなければ1をかけて else sosuu=0;   0なら0をかえします  } }  そうすると素数ならsosuuは1となります。 if(sosuu)  そのときは1つ先のbitを1にします。 { l=1<<i; kenchi|=l; } } }

関連するQ&A

  • C言語のビットフィールドについて

    はじめまして,今C言語を勉強中なのですが, ビットフィールドの宣言について質問があります。 勉強に使用しているテキストでは, ビットフィールドの宣言にはunsigned int型を使用すると書かれています(下記例参照)。 ここで質問は,unsigned charなどの型は推奨されない理由があるのか,ということです。 実際にunsigned char型で実行してもプログラムは動きますし,そちらのほうが語長も短くて済むのでいいような気がします。 テキストの書き方だと,他の型について言及していなかったので,なにか理由かあるのか,それとも特に問題ないのか,疑問に思っています。 わかる方いましたら,回答いただけると嬉しいです。 (ex) struct{ unsigned int bit0:1; unsigned int bit1:1; : unsigned int bit7:1; }bits;

  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

  • 配列のビット設定方法

    以下のようにビットを設定する場合、どのようにすればよいのでしょうか? 効率よく設定したいのですが・・・。 // bit // 23 - 21:week1 // 20 - 18:week2 // 17 - 15:week3 // 14 - 12:week4 // 11 - 9:week5 // 8 - 6:week6 // 5 - 3:week7 // 2 - 0:week8 unsigned char week[3]; 上記の変数にこの変数の内容を設定する // 以下の変数の範囲は 0~7 unsigned char week1; unsigned char week2; unsigned char week3; unsigned char week4; unsigned char week5; unsigned char week6; unsigned char week7; unsigned char week8; ---------------- week[0] = ( week1 << 5 ) & ( week2 << 2 ) & ( week3 >> 1 )  ・ ・ ・ 上記のような感じで設定できると思うのですが、もっと効率的に方法はないでしょうか? 配列の数が多くなると面倒ですので。。。 よろしくお願いします。

  • 【C++】巨大なビット配列の用意の仕方

    現在C++で数値計算用のプログラムを組んでいます。 その計算の中で、2^16個の「on」または「off」のデータをメモリに記憶させる必要があります。その一つ一つにわざわざintやshortなどの既存のデータ型を使うのは馬鹿らしいので、2^16桁の二進数列(=8.2KB程度)を用意して操作したいと思っています。 (もし仮にon=+1,off=0などとしてint型配列を使うと、262KB必要となり、いくつも宣言することがためらわれます。この2^16個のデータを収める「配列」は全部で8000個程度用意したいのです。) これだけ大きなビット配列を、C++で用意するにはどうしたらよいでしょうか? 試しにビットフィールドを用いて struct bit{ unsigned elm :1<<16;  //2^16個のビット数列 }; と宣言してみたのですが、基本型のビット数を超えるからとコンパイルは通りませんでした。@VC++ リソースを活用するためにビット配列を扱った経験のある方など、どうかご教授よろしくお願いします。

  • 8個のビットを1バイトとして扱う方法

    1バイトをビット扱いする方法は、 union un_p1dr { unsigned char one_byte ; struct { unsigned char b7:1 ; unsigned char b6:1 ; unsigned char b5:1 ; unsigned char b4:1 ; unsigned char b3:1 ; unsigned char b2:1 ; unsigned char b1:1 ; unsigned char b0:1 ; } bit ; } ; #define pt_da_p1dr (*(volatile union un_p1dr *)0xffffd0) と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。 この反対を行える宣言方法は、あるでしょうか? つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・ ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが 可能なように、ハード割り当てが出来ません。 従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。 なにか良い宣言方法があれば、ご伝授していただけないでしょうか? 宜しくお願いいたします。

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • ビット操作について

    void print_bit(unsigned x) { for(int i=int_bit()-1;i>=0;i--) { putchar(((x>>i) & 1U)?'1':'0');      } } int main(void) { print_bit((~0>>16)); return0; } と入力したのですが、結果が 111111111111111111111111111111 と出てしまうのですが。 自分的には0000000000000000111111111111111と出したいのですが。 どうしたらいいのでしょうか? できるならどうしてこのような結果になったのか教えていただけたらな と思います。よろしくお願いします。

  • ビットデータのチェック方法

    C言語でのビットデータのチェック方法についての質問です。 例として、以下のようなのビット(0~31)を用意して unsigned int bit; bit = 010100…00101 という風にデータを与えているとします。 このとき、ビットに1を持つ桁の個数を数えて 010000→1個 、001001 →1個以上 という風に1個しかないか、それ以上あるかを高速で判定したいのですが、どのような方法が考えられるでしょうか。 私が考えた方法としては count = 0; for (i=0 ; i < 32 ; i++){ if ((bit >> i)%2 == 1) count++; if (count > 1) break; } //countが1なら個数は1個、countが0か1以上なら1個でない。 という方法も行いましたが、処理が遅くなってしまいます。 各桁が1の場合(00…010等)のデータを用意しておき、ビットの値を連想配列へ入れて判別するという方法も考えましたがC言語では無理なようです。 可読性や汎用性は問わないものとして、何か良い方法は無いでしょうか? ご存知の方いらっしゃいましたらよろしくお願いします。

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • ビットを操作する。

    if( b&a )の所、 45678 & 32768 が二進数でANDされると思いますが if( b&a )内で具体的にどんな計算されるのか教えてください。 unsigned  a; unsigned  short b = 45678; for(a=32768; a>0; a=a/2) if( b&a ) printf("1 "); else printf("0 ");