No.4ベストアンサー
- 回答日時:
根本的な解決ではないですが・・・次の式で出来るかも?
------------------------------------------------
unsigned int math[4];
unsigned int shift; // シフト用
~ 中略 ~
for (i=0 ; i < 100 ; i++){
shift = i & 0x1F; // 0~31までがシフト範囲
if(math[i >> 5] >> shift == 1) printf("%d", i)
}
※int型は4バイト、1バイト=8ビットとする。
------------------------------------------------
出席番号は以下の通りになります。
math[0] ... 0~31番
math[1] ... 32~63番
math[2] ... 64~95番
math[3] ... 96~99(MAX127)番
・・・最近はVB4の保守ばっかやってるので
もしかしたら構文がおかしいかもしれません。(^-^;)
以上、頑張ってください。
No.8
- 回答日時:
単純に 100bit 準備したいのであれば、ビットフィールドという手もあることはあります。
strcut member_list_type {
unsigned int no1 : 1;
unsigned int no2 : 1;
unsigned int no3 : 1;
……
unsigned int no99: 1;
unsigned int no100: 1;
};
strcut member_list_type members;
とすれば、
member.no1 = 0;
等とできます。それぞれは、1bit の領域を持ちます。
でも、これでは配列として扱うこともできませんし多分不便でしょう。
unsigned int bit[4];
でまかなう場合には、配列風に扱えるような関数を一式定義するのが常套手段です。
set_bit(unsigned int bit[], int n);
// bit[] の先頭から数えて、n bit めをセットする
clr_bit(unsigned int bit[], int n);
// bit[] の先頭から数えて、n bit めをクリアする
unsinged int test_bit(unsigned int bit[], int n);
// bit[] の先頭から数えて、n bit めの値を返す
これで、
if(test_bit(bit, 3) == 0) set_bit(bit, 3);
のようなことはできます。
さらに、No.7 で提示されているような方法だと
struct kamoku_list_type
{
unsingned int kamoku1: 1;
unsingned int kamoku2: 1;
unsingned int kamoku3: 1;
};
strcut kamoku_list kamoku[100];
で、n番目の人の科目は、
kamoku[n].kamoku1 などで参照できます。
さらに、現在では多くの場合、「データをビットで扱う」必要はほぼないと思います。
int kamoku[100]
で普通に、1 や 0 を代入/テストする方が動作としても速くなることが多いですし。
とりあえずビットを複数用意する方法と、配列で確保する方法を比べながら、自分に会った方を選んでいきたいと思います。
みなさまありがとうございました。大変勉強になりました。
No.7
- 回答日時:
そもそもイメージが逆と思いますが。
出席番号分100ビット化するのではなく、履修科目分、数ビット化すればよいのかと。この場合だと、配列が100となりますが、お気に召されませんでしょうか。
出席番号をnとし、bit(n)のビット0、1で履修なら1の各科目フラグとすると、bit(n)が3なら両方、0でないなら1科目以上となります。
これなら、何教科も追加できますよ。何ビットも余ってますから。
No.6
- 回答日時:
>配列(例:bit[4])でもできますが、出席番号を求めるときなどは、場合分けが必要になるため、なるべく1つの変数で行いたいのですが、難しいようですね…。
なるほど、そういうことですか。1つの変数で、最大のビットをもつものは、long long int型で64ビットがありますので、64人分までなら可能ですが、64人以内に限定することは、あまりよくないですね。
ここで、考え方をもっとシンプルにして、char型でデータをもち、1バイトで、1人分のデータにしては、どうでしょうか。
例えば、char math[100];とjapanese[100];を定義し、履修あり=1、履修無し=0とします。
数学を履修している人の出席番号(0~99)は
for (i=0 ; i < 100 ; i++){
if (math[i] == 1) printf("%d,",i);
}
で簡単にあらわすことができます。
この場合は、無理に1ビットで1人の状態を表す必要はないかと思います。
ビットにした方がよい場合は、非常に多くの出席番号(例えば1万以上)があて、データのサイズを節約したい場合などがありますが。
ビットにした場合は、#5の方のようになるかと思います。
No.5
- 回答日時:
普通に原文ソースを写し間違えそのまま編集してました。
(^-^;)以下、ANo.4の修正箇所となります。
誤) if(math[i >> 5] >> shift == 1) printf("%d", i)
正) if ( (math[i >> 5] >> shift)%2 == 1) printf("%d,",i);
No.3
- 回答日時:
> unsigned char bit;
> 1バイト(=8ビット)なので8桁ということは勉強しました。
char型(unsigned charでも同じ)のビット数は、<limits.h>で定義されるCHAR_BITマクロで表されます。CHAR_BITマクロの値は8以上であり、これが1バイトのビット数になります。したがって、1バイトが9ビットであったり、16ビットや64ビットの環境も存在します。
> 以下のように32*4桁という風に分ける方法しかないのでしょうか?
> unsigned int bit[4];
これも、unsigned int型のビット数は少なくとも16ビット以上ですので環境に依存します。確実に100ビット以上を確保するには、
unsigned char bit[(100+CHAR_BIT-1)/CHAR_BIT];
とする必要があります。
また、基本型で100ビット以上を確保するための一般的な方法はありませんが、処理系によっては__int128_tといった型が存在する場合がありますし、unsigned long long型が100ビット以上ある可能性もなくはないので、一通り調べてみてください。
No.2
- 回答日時:
>unsigned char bit;
>1バイト(=8ビット)なので8桁ということは勉強しました。
はい、それであってますよ。
>ここで、たとえば計算でビットの桁数を100桁用意したい場合
>以下のように32*4桁という風に分ける方法しかないのでしょうか?
>unsigned int bit[4];
はい、そのようにするのが普通です。
>できれば一つの変数で済ませたいのですが
どうして、そのような質問をされたのかを書かれると、よい回答が得られやすくなります。
かってな推測ですが、非常に大きな数値を扱いたいのでしょうか。
もし、そうであれば、それは、小数点以下の値を含む実数でしょうか、それとも整数でしょうか。
質問内容がわかり難くて申し訳ございません。
問題の例として
たとえば生徒が100人(出席番号0~99)いたとして、選択科目の国語と数学を履修しているとします。
これをそれぞれの科目を履修しているかしていないかをビットで表すとして、履修している人を1、していない人を0とすると
変数japanese(国語)とmath(数学)
japanese = 10000001000…0001;
math = 11100110011…0101;
とデータ化しておき
両方履修している人 = japanese & math;
1科目以上履修している人 = japanese | math;
数学を履修している人の出席番号
for (i=0 ; i < 100 ; i++){
if ( (math >> i)%2 == 1) printf("%d,",i);
}
という風に利用したいと考えています。
配列(例:bit[4])でもできますが、出席番号を求めるときなどは、場合分けが必要になるため、なるべく1つの変数で行いたいのですが、難しいようですね…。
No.1
- 回答日時:
> 1バイト(=8ビット)なので8桁
1バイトが8ビットでない環境もあるように聞いています。
_lim.h かどこかで定義している CHAR_BIT の値(8かもしれないし、
8以外かもしれない)を確認する方がよいのではないかと思います。
> unsigned int bit[4];
> できれば一つの変数で済ませたいのですが
bitという、一つの変数ですんでいますけれど…。
添字を使いたくない、ということでしょうか?むずかしいのではないかな…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- 計算機科学 ビット計算 2 2023/04/16 14:26
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 高校 高校化学、気体、温度の有効数字 3 2023/04/02 11:39
- 英語 数字の単位について教えてください 6 2022/11/10 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C++ 構造体の一括初期化 {0}
-
関数の引数の順番の混乱を回避...
-
日付チェック関数について
-
構造体のデータを丸ごとコピー...
-
C言語で確保できるビットの桁数
-
int型とchar型について
-
VBAの変数のデータ型を変更する...
-
命名規則 VB 構造体
-
C++/CLIの構造体のコンストラク...
-
構造体のパックの仕様の違いに...
-
値が変わるのはどうしてでしょ...
-
配列を持ったオブジェクト変数...
-
1バイトデータの読み出しについて
-
C言語 構造体の中に共用体を定...
-
コンストラクタ内での動的メモ...
-
整数から16進数への変換 現在c...
-
ローカル変数の多重定義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C++ 構造体の一括初期化 {0}
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
long型のデータをバイト型の配...
-
typedefをプログラム中で解除す...
-
1バイトデータの読み出しについて
-
VBAの変数のデータ型を変更する...
-
charとucharの違い
-
VBAで符号無し整数
-
値が代入されてない時
-
構造体にする理由・利点・使用例
-
VBAにてcolorindexを変数に格納...
-
ユーザー定義型変数の一括初期化
-
構造体のポインタにNULLが入らない
-
命名規則 VB 構造体
-
リッチテキストボックスの中身...
-
整数から16進数への変換 現在c...
おすすめ情報