• ベストアンサー

c言語 Bitについて

100bit存在したとして、98Bit目に対してフラグを表示したい場合どのように行ったら最適でしょうか? 現場Byte算出して該当するバイト箇所にビットを立てている状況です。 98bit目に直接触る事は可能でしょうか。 また10Bitずつ区切って表示したい場合どのように行ったら最適でしょうか? 色々調べたのですが、思い通りの状態へは至っておりません。 お力をお貸しください。 宜しくお願い申し上げます

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

他のかたが指摘されているように100バイトの領域で判断したほうがシンプルです。 char[13]にして87バイトを節約する意味はないと思いますが、 ビットの操作の勉強をかねてということで回答いたします。 以下のようにして下さい。 ビット位置は左から0~99で示しています。(1から99ではありません) 1回目は全体をOFFにしてから指定位置のビットをONします。 2回目は全体をONにしてから指定位置のビットをOFFします。 -------------------------------------------------------------- #include <stdio.h> #include <string.h> //bitをONする。 //bdata:ビットデータ //bpos:onするビット位置(0~99) void BitOn(unsigned char bit_data[],int bpos) { int byte_ix = bpos / 8; int shift_bit = bpos % 8; bit_data[byte_ix] |= (unsigned char)(0x80 >> shift_bit); } //bitをOFFする。 //bdata:ビットデータ //bpos:offするビット位置(0~99) void BitOff(unsigned char bit_data[],int bpos) { int byte_ix = bpos / 8; int shift_bit = bpos % 8; bit_data[byte_ix] &= ~(unsigned char)(0x80 >> shift_bit); } //指定bit位置のデータがONかOFFかを返す。 //bdata:ビットデータ //bpos:ビット位置(0~99) //戻り値:1=ON 0=OFF int BitCheck(unsigned char bit_data[],int bpos) { int byte_ix = bpos / 8; int shift_bit = bpos % 8; unsigned char data = bit_data[byte_ix] & (unsigned char)(0x80 >> shift_bit); if (data == 0) return 0; return 1; } //bitを10桁区切りで画面に表示する。 //bdata:ビットデータ void BitDisplay(unsigned char bit_data[]) { int bit; int i; //見出し印字 printf("0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789\n"); for(i = 0; i < 100; i++){ if ((i > 0) && (i % 10) == 0) printf(" "); bit = BitCheck(bit_data,i); printf("%d",bit); } printf("\n"); } int main(void) { unsigned char bit_data[13]; //全体をOFFする memset(bit_data,0x00,sizeof(bit_data)); //0,7,10,11,19をONする。 BitOn(bit_data,0); BitOn(bit_data,7); BitOn(bit_data,10); BitOn(bit_data,11); BitOn(bit_data,19); //ビット状態を表示 BitDisplay(bit_data); //全体をONする memset(bit_data,0xFF,sizeof(bit_data)); //0,7,10,11,19をOFFする。 BitOff(bit_data,0); BitOff(bit_data,7); BitOff(bit_data,10); BitOff(bit_data,11); BitOff(bit_data,19); //ビット状態を表示 BitDisplay(bit_data); return(0); } ---------------------------------------------------------- 実行結果 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 1000000100 1100000001 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0111111011 0011111110 1111111111 1111111111 1111111111 1111111111 1111111111 1111111111 1111111111 1111111111

flower_flower
質問者

お礼

皆様まとめての御礼で申し訳ございません。 沢山のご回答・ご意見ありがとうございます。 皆様のご意見を参考に無事行いことが実現できました。 区切りの悪い状態にも関わらずご意見を頂いた事感謝致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「10bitで1つのデータに対しての情報になる」んだったら, 最初から「10ビット入るもの」を使えばいいのに.... 本気で「1バイト単位で節約したい」んだろうか. でも, そこで節約してもコードが大きくなって「節約」にならない可能性も高そうなんだけどなぁ.

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

効率は無視しますが int getBit(char * b, int n) : nビット目の1/0を得る void setBit(char * b, int n,int d) : nビット目をdにする を作ります。実装は、とりあえずは「現場Byte算出して該当するバイト箇所にビットを立てている」等でよいでしょう。 こうすれば、98bit目なら getBit(data,98) で得られます。ビットを立てるなら setBit(data,98,1)です。 10bitずつ出力したいのなら次のようにできます(最下位が0ビット目の場合) for(i=0;i<10;++i){ for(j=9;j>=0;--j){ printf("%1d",getBit(i*10+j)); } printf("\n"); } あるいは、10bit単位ならば int get10Bit(char * b, int n) : n番目の10bitを得る void set10Bit(char * b, int n,int d) : n番目の10bitをdにする を用意するという方法もあります。 98bit目というのも、dataBit[9][8]といったイメージではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

追記です。 計算している、というところが実際の式が書かれていなかったのでスルーしましたが、四則演算を使っているのであれば改善できます。 オンにしたいbitの番号がある数値を、下位8ビットをorするデータに、 8ビット以上の上位の値を8ビット右シフトして、バイト単位になっているフラグの配列の要素番号として取り出せば済むわけです。 こういう使い方をすると2進数の有り難味が出ると思いますよ。

flower_flower
質問者

補足

皆様ご回答ありがとうございます。 曖昧な情報で申し訳ございません。 >100bit存在したとして、98Bit目に対してフラグを表示したい場合どのように行ったら最適でしょうか? 上記は98bit目に対してフラグを立てたい。という意図でした。 誤記をしてしまいご迷惑をお掛けしました。 >また10Bitずつ区切って表示したい場合どのように行ったら最適でしょうか? 上記は言葉通り10bitずつ2進数でファイルまたは画面に表示したいということです。 (10bitで1つのデータに対しての情報になるため) 100bitや10bit等区切りが悪いのは重々承知しております。 100bitだけ使用したいので、char data[13]として残り4bitは無視する形になります。 今回bitを初めて使うのでうまくまとまっていないかもしれませんが、 現状このような状態となっております。 以上宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.3

うむ、bitを扱っているのに、100bitとか10bitとか言っているようでは2進数のことがまるでわかっとらんようじゃの。 128bitとか16bitとかまたは8bitとかキリの良い数字を問題にすべきでしょう。 近いところで96bitとか12bitですね。 > 98Bit目に対してフラグを表示したい場合 これも日本語として意味不明。 多分、表示というのはオンにしたい、ということだとは思うけど、100%そうだとは言い切れないところが、設問の曖昧さがあります。 それにbitは絶対にBitとは書かない。 > 現場Byte算出して該当するバイト箇所にビットを立てている状況です。 Byteという単位を知っているじゃないですか。 bitを立てるという言葉も知ってるし。 私はこの方法が良いと思いますよ。 Byteであれば処理系に依存しませんからね。 16bit、32bit、64bitの各処理系によって、処理方法を変えるのは大変です。 128bitマシンなら98bit目でもor一発ですけどね。 > また10Bitずつ区切って表示したい場合どのように行ったら最適でしょうか? ここでも表示ですか。bitを立てるということかな、前の文章から推測して。 10bitですか… なんとなく問題の本質が分かってきましたよ。 2進数に拒絶反応が出てて、なんとか10進数の世界に持ち込もうとして、問題を複雑化していますね、きっと。 10bitに切ること自体が最適ではない、ということですよ。 中途半端だから。 素直に2進数を受け入れ、10進数は暫く頭から取り出しておいた方がいいですよ。 先に進めないですよ。 こういうこだわりを頑固というのです。 学習の邪魔物です。 そうですね、and、or、notを使って加算機の回路図でも作ってみたら如何ですか。 2進数の理解や重要性が少しでも分かるかも。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

フラグを表示するというのがどういうことかわかりませんが... もし、<stdint.h>にuint100_tとかuint128_tとかがあれば、また、uintmax_tが100ビット以上あるのなら、次のようにすればLSBから起算して98ビット目を1にすることができます。 uintmax_t value = 0; value = (uintmax_t)0 << (98 - 1); 10ビットずつ区切って表示する方法ですが、上位からであれば、 for (int i = 9; i >= 0; i--) {  uintmax_t t = (value >> 10 * i) & 0x3ff;  // t を表示 } このようにすればよいかと思います。 実際の表示部分は、どのような形式でどんなデバイスに表示するのかわかりませんので、必要に応じて対応してください。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Bitデータをどのように扱うかはCの仕様ではないのでハードウエア、使用目的を考慮してユーザーが決定する事項です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語の質問です。

    開いたデバイスやファイルから2バイト読み込んで上位4bitを削除し、残りの12bitを表示することは出来ますでしょうか?できるのであれば具体的にどのような記述をすれば良いのでしょうか?サンプルプログラムなどあると理解しやすく助かります。よろしくお願いします。

  • 【VC++2005 MFC WindowsXP】バイナリからbit取得

    【VC++2005 MFC WindowsXP】バイナリからbit取得 バイナリファイルの先頭から単純に1bitずつ値を取得し、そのbitが立っているかどうか判定したいと思っております。 私の頭の中では以下のようなイメージでいるのですが、「高速化」「可読性」など、どんな観点でも構いませんので、修正できそうな点をご教授願いますm(__)m (※全面的に修正していただいてももちろん構いません) ・ファイルから1バイト取得する。 ・そのバイトと「(byte & 0x80) ? 0 : 1」を行い、最初のビットがたっているか判定する。 ・次のbitを判定する際には「(byte & 0x40) ? 0 : 1」を行う。 ・このように1byte分(8回)判定を行ったら、次のバイトをファイルから読み込む。 ・これをファイルの最後まで繰り返す。 もっとスマートで高速に処理出来ないか模索しておりますが、何も思いつかず・・・ 参考になるサイトだけでも構いませんのでよろしくお願いいたしますm(__)m

  • CHAR_BITについて

    ”CHAR_BITは開発環境に依存する為、他の環境では正しく動作しない可能性があります。つまり、普通は1バイトが 8 ビットですが、なかには 9 ビットというコンピュータが存在します”と言う事を、C言語の本で読んだのですが、何ゆえCHAR_BITが開発環境によりビット数が違うのか解りません。CPU等ハードの問題なのか、文字コード等ソフトの問題なのか解りません。どなたか、具体的にご教授できたら幸いです。宜しく願います。

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

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

  • IE9 32bitがPCに見つからない

    IE9 32bitがPCに見つかりません。 IE9 64bitはスタートメニューに存在していますが、IE9 32bitの表示がなくて困っています。 通常64bitのPCを購入するとIEは64・32bitの両方がインストールされている聞いたのですが、 どこを探しても見つかりません。 利用しているソフトがIEの32bitしか対応していません。 IE7・8・9の32bitならOKです。 IEの32bitをインストールしたいのですが、microsoftのIE9 32bitのページからインストールをしてみましたが、OSが64bitのためエラーとなり出来ませんでした。 PCにIE9の32bitあれば表示させる方法 もしくは、IE9 32bitをインストールする方法を教えてください。 利用PC:富士通 ESPRIMO FH56/DD OS:Windows7 Home Premium 64bit IE9 64bitは購入時からありました。 どなたかご存知の方、教えてください。

  • 16進数のバイト数

    16進数のバイト数を出力させます。 printf("%d byte\n",sizeof(0x12)); ⇒4 byte 4bit×2=8bit(1byte)になると思ったのですが、なぜ4byteになるのでしょうか。 基礎的なことかもしれませんが、原因が分からず悩んでしまいました。 もしお分かりの方いらっしゃいましたら教えてください。

  • DAWビットレート高品質変換32bit→16bit

    プロの現場ではビットレート等32bit/192kHzで録音し それを16bit/44khzに変換してCd化するのが主流なようですが、 アマチュアでDAWをやってる人間が通常使っているソフト等で変換しても劣化するだけで最初の32bitとか意味がないみたいですよね? ですが最近SSRCというリサンプラの存在を知ってこれだとあまり劣化せずに16bitに変換できるそうです。 ですがなぜか一部の心無いユーザーへの抗議として現在ダウンロード不可になっています。 ですので、このソフトの代わりになるような高音質で変換できるソフトってないでしょうか? あったら教えてください。 お願いします。

  • 32bitパソコンのデータを64bitパソコンで使えますか?

    32bitパソコンのデータを64bitパソコンで使えますか? 現在、Win XP 32bitのパソコンを使用しています。Win7 64bitのパソコンを購入した場合、32bitのパソコンで作成した各種データ(ACCESS、EXCEL、JPG画像等)は使用(表示、加工処理等)出来なくなるのでしょうか。使用出来ない場合、その対処方法もご指導下さい。

  • win8.1 64bit と 32bit

    東芝一体型PC D813/T8JW  win8.1(64bit)ですが、 win8(32bit)をデユアルブートさせた場合、 認証問題は存在するのでしょうか。 一太郎10を使いたい:他のwin8(32bit)PCでは動きますが、この東芝PCでは動かないので。

  • 64bitから32bitへの移行

    パソコンが苦手な者です。御教示願います。  現在 Windows7 64bitがプレインストールされたパソコンを使用しています。  仕事で使用しているソフトが32bitにしか対応していない為、32bitに移行せざるを得ない状況になりました。  PCメーカーに問い合わせたところ、アップグレード版で対応可能との回答だったので、Windows8のアップグレード版を購入して32bit用をインストールしようとしたところ、先に進むことができません。  1.アップグレード版で、Windows7 64bit→Windows8 32bitに移行する方法を御存知でしたら御教示願います。  2.過去の質問に、Windows7 64bit→Windows7 32bitの場合、通常版でなければ対応できないという回答がありましたが、→Windows8 32bitの場合でも通常版をインストールしなければいけないのでしょうか。  3.通常版をインストールしなければいけない場合、Windows8 32bitの場合、通常版とDSP版は同じなのでしょうか。  足りない情報がありましたらご指摘ください。  宜しく御願い致します。

このQ&Aのポイント
  • ドライバーのインストールが出来ないというトラブルが発生しました。詳細な経緯や試したことを教えてください。
  • ドライバーのインストールが出来ない問題について相談です。PDFファイルの印刷ができなくなり、プリンターの設定や再インストールを試みましたがうまくいかず、認識の問題が続いています。
  • 【DCP-J526N】のドライバーがインストールできません。PDFファイルの印刷中に突然停止し、プリンターの設定や再インストールを試みましたがうまくいかない状況です。ご相談ください。
回答を見る