電子書籍の厳選無料作品が豊富!

100bit存在したとして、98Bit目に対してフラグを表示したい場合どのように行ったら最適でしょうか?
現場Byte算出して該当するバイト箇所にビットを立てている状況です。
98bit目に直接触る事は可能でしょうか。


また10Bitずつ区切って表示したい場合どのように行ったら最適でしょうか?
色々調べたのですが、思い通りの状態へは至っておりません。
お力をお貸しください。
宜しくお願い申し上げます

A 回答 (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
    • good
    • 0
この回答へのお礼

皆様まとめての御礼で申し訳ございません。
沢山のご回答・ご意見ありがとうございます。

皆様のご意見を参考に無事行いことが実現できました。
区切りの悪い状態にも関わらずご意見を頂いた事感謝致します。

お礼日時:2013/06/13 08:49

「10bitで1つのデータに対しての情報になる」んだったら, 最初から「10ビット入るもの」を使えばいいのに.... 本気で「1バ

イト単位で節約したい」んだろうか. でも, そこで節約してもコードが大きくなって「節約」にならない可能性も高そうなんだけどなぁ.
    • good
    • 0

効率は無視しますが



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]といったイメージではないでしょうか?
    • good
    • 0

追記です。



計算している、というところが実際の式が書かれていなかったのでスルーしましたが、四則演算を使っているのであれば改善できます。

オンにしたいbitの番号がある数値を、下位8ビットをorするデータに、
8ビット以上の上位の値を8ビット右シフトして、バイト単位になっているフラグの配列の要素番号として取り出せば済むわけです。
こういう使い方をすると2進数の有り難味が出ると思いますよ。

この回答への補足

皆様ご回答ありがとうございます。
曖昧な情報で申し訳ございません。

>100bit存在したとして、98Bit目に対してフラグを表示したい場合どのように行ったら最適でしょうか?
上記は98bit目に対してフラグを立てたい。という意図でした。
誤記をしてしまいご迷惑をお掛けしました。


>また10Bitずつ区切って表示したい場合どのように行ったら最適でしょうか?
上記は言葉通り10bitずつ2進数でファイルまたは画面に表示したいということです。
(10bitで1つのデータに対しての情報になるため)

100bitや10bit等区切りが悪いのは重々承知しております。
100bitだけ使用したいので、char data[13]として残り4bitは無視する形になります。

今回bitを初めて使うのでうまくまとまっていないかもしれませんが、
現状このような状態となっております。

以上宜しくお願い致します。

補足日時:2013/06/11 08:59
    • good
    • 0

うむ、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進数の理解や重要性が少しでも分かるかも。
    • good
    • 0

フラグを表示するというのがどういうことかわかりませんが...



もし、<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 を表示
}

このようにすればよいかと思います。
実際の表示部分は、どのような形式でどんなデバイスに表示するのかわかりませんので、必要に応じて対応してください。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!