• ベストアンサー

数値フラグの判定方法

ビットフラグの方法ではなく 数値フラグの計算というか判定の方法の話なのですが、 C++でファイルから設定を読み込む時、 1つの整数にフラグをまとめ様としているのですが、 パターン1  :1の位 10の位 100の位 1000の位・・・ とわけて位毎に3~5種程のフラグを持たせている場合の、10・100の位の取り出し方 パターン2  :On/Offだけで、1・2・4・8・16・32・・・・・とわけている場合の、2・4・8・16の部分の取り出し/判定方法 ビットでの操作はシンプルだったので理解できたのですが、 数値としての場合、どう計算すれば任意の場所を取り出せるのでしょうか? 初歩的な事かもしれませんが、検索しても計算方法を見つけきれませんでした; どなたか教えて頂けると幸いです。 っ_ _)っ

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

  • ベストアンサー
  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.2

パターン2について &演算子で判定できますよ. if(入力値 & フラグ値)~です. Cですけどこんな感じでテストしてみました. 4を引数にするとFlag4だけ,6だとFlag2とFlag4が出力されます. #include <stdio.h> #include <stdlib.h> void main(int argc, char *argv[]){   int flag = 1;   int inputNum = atoi(argv[1]);   while(flag<64){     if(inputNum & flag)printf("Flag %d\n",flag);     flag*=2;   } }

zaxs5968
質問者

お礼

下のコードの方はまだよく理解できませんでした。すみません; しかし、&単体で直接数値のビット判定(?)が出来るのですね。 初めて知りました。 かなりためになりました。ありがとうございますっ

その他の回答 (2)

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.3

100の位を取り出すなら1000で割った余りを100で割れば取れますが。

zaxs5968
質問者

お礼

! そ、その通りですね; ありがとうございますー! orz

  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.1

パターン1 単純に10や100、1000で割ったらダメですかね? 3204なら1000で割れば3になりますよ。 パターン2 ビット見るのじゃダメですか? 数字でやるのは結構骨というか面倒ですね。

zaxs5968
質問者

お礼

上は、間の数が直接割ると数字1つになってくれなくて困っていました; 下はこう、なんというかわからないもどかしさが募っていて; ご助言、ありがとうございました~

関連するQ&A

  • 空いているビットフラグの確認方法

    空いているビットフラグの中で最小のものを見つけたいのですが、 うまい方法がわからず、どのように作成したら良いか、ご教授お願いします。 たとえば、 int nFlg = 0xFF8F; //上位16ビット省略 というフラグの場合、空いている(ビットフラグの無い)箇所は int nFalse = ~nFlg; // = 0x0070 で求められますが、この中から、最小のフラグ位置(0x0010)を求めたいのです。 (未使用のフラグの中から、使えるビットひとつを選びたいのです・・) 総当りしかないでしょうか? よろしくお願いします。

  • Z80のフラグレジスタについて

    Z80のフラグレジスタについてです。 3bit目と5bit目は使用しないということが本に書いてありますが、このbitに数値(1)が入る場合ってあるのでしょうか? もし入るならどのような時なのでしょうか?

  • エクセルの数値判定について

    エクセルの数値判定について教えてください。 パーセンテージ判定なのですが、ある計算をして E1 -1.89% E2 0.21% E3 -1.81% E4 1.15% E5 0.94% 以下続く とあるとします。 そこでE列のパーセンテージの値に対して振り分けを行いたいのです。 それは1.00%以上ならA,0.10%~0.99%ならB、0.09%から0まではC1、 0から-0.09%まではC2、-0.10%~-0.99%まではD、-1.00%以下ならE とF列に表示したいのですがその方法がわかりません。 よろしくご教授くださいませ

  • エクセルで数値を整数に直す

    エクセルでセル内の数値を整数に直す方法を教えてください。 具体的には、 学校で1学期から3学期までの成績を10段階で評価でつけるとします。(成績はすべて四捨五入した整数で出します) 各学期は中間・期末テストでの10段階評価を平均し、さらに年度末は各学期の成績を足して3で割ります。 この場合、それぞれの段階で端数を四捨五入して完全な整数に直さないと、学年末の評価にずれが生じてしまうときがあります。 なぜなら、表記の上ではセルの書式設定などで整数に直しても、エクセルの計算式の上では端数処理をしていない実際の数値を使うため、合計したときにずれがでてしまうのです。 例えば、以下のような場合です  ※( )内は実際の数値です。  1学期 6(5.5)  2学期 8(7.5)  3学期 6(6.0) 整数で処理している場合の学年末評価 7(6.7・・・) 実際の数値で処理している場合の学年末評価 6(6.3・・・) このような問題を解決するために、各学期ごとに端数を完全に整数になおしたいのですが、書式設定以外の方法で、何かやり方はないでしょうか? ROUND関数を使えばいいのでしょうか? ちなみに、今は打ち直して単なる数値として別に計算しています。 どなたかご存じの方がいらっしゃいましたら、教えてください。

  • エクセルの判定式の作り方を教えてください

    A列B列C列に入力した数値を以下のように判定したい場合は どのような計算式を入力したらよろしいでしょうか? できれば(パターンA)と判定が出ると助かります。 A列を基準に (パターンA)Aより大きいB / Bより大きいC (パターンB)Aより大きいB / Bと同じC (パターンC)Aより大きいB / Bより小さいC (パターンD)Aより小さいB / Bより大きいC (パターンE)Aより小さいB / Bと同じC (パターンF)Aより小さいB / Bより小さいC

  • VBAで入力数値について

    Excel VBAでTextBoxに入力された数値が整数か小数か判定し、 小数の場合は、下記のようにしたいのですが、どのようにしたらよいのでしょうか。 TextBoxに入力された数値が、 (1)整数の場合・・・A=TextBox1.Value (2)小数点第一位の場合(1.5など)・・・A=TextBox1.Value*10 (3)小数点第二位の場合(1.55など)・・・A=TextBox1.Value*100 どなたかご教授願います。

  • 配列の確認

    【環境】Windows XP、C++ サイズがXの配列があります。 配列は0~X-1の数値が1つずつ入れる目的で作っています。 その配列に値の重複が無く、全ての数値が入っているかを確認する処理なのですが、 自分が考えた方法で問題ないのかを確認してもらえないでしょうか? 処理としては、unsigned long long int型をフラグとして使って、(Xが64以上になる予定は今のところないので・・・、けど64に制限されるのが・・・。) 0が入っていたら1ビット目を立てて、1が入っていたら2ビット目を立てて、(以降最後まで続ける)にしようと思っています。 最終的に立っているフラグの数値が、2の(X+1)乗―1とイコールかを判定。 (←計算間違ってるかも) これで問題ないでしょうか? 他にいい案があれば教えてもらえないでしょうか? 以上、よろしくお願いします。

  • 数値の組み合わせを求める方法

    数値の組み合わせを求めるのによい方法はありませんか。 具体例を書きますのでよろしくお願いします。 2,3,5,8の4個の数値があります。 この数値のいずれかを足して10になる組み合わせを 求めたい。 この場合の答えは、 2+3+5=10または2+8=10から、 2,3,5の組み合わせ、または2,8の組み合わせ となります。 また、上の場合で、足して11になる数値の組み合わ せは、3,8の組み合わせのみです。 これらは、簡単に求められますが、数値が多くなって くると手で計算していては、ものすごく時間がかかって しまいます。 エクセルを使って、ササーッと求める方法があったら 教えてください。

  • ALUのオーバーフローフラグの生成条件の証明などの問題

    ALUのオーバーフローフラグの生成条件の証明などの問題 A,Bを2の補数による符号付きnビット2進数の整数入力とする。nビットALUの演算結果により生成される条件判定フラグ、すなわちN(Negative)、 V(oVerflow)フラグについて書の問に答えよ。ただし、ALUの演算結果は(F[n-1]・・・F[0])とし、ALUを構成する加算回路の桁上げ出力に おいて、最上位の桁上げ出力はC[n]、その1ビット下位の桁上げ出力をC[n-1]とする。 (1)オーバーフローフラグV(oVerflow)を生成する条件が"C[n]xorC[n-1]=1"となる事を証明せよ。 (2)上記ALUを用いた算術比較演算において、A<Bの判定条件がオーバーフローの有無に関係なく、"N xor V=1"となる事を証明せよ。 ------------------------------------------------------------ このような問題があるんですが、解答は分かりません。 証明せよとは一体どのように記述すればいいんでしょうか? あと、(2)は何故"N xor V=1"と表せるんでしょうか? 一応、自分で考えたのはこんな感じです。 (1) 加算時のオーバーフローの条件は、 符号がA,B共に負、つまりC[n]が1でかつ、nビット目が1にならずに、正の値になってしまう数であるC[n-1]=0の場合と、 符号がA,B共に正、つまりC[n]が0でかつ、nビット目が1にならずに、負の値になってしまう数であるC[n-1]=1の場合である。 よって、オーバーフローフラグが生成される条件をC[n]xorC[n-1]=1と表すことができる。 (2) 演算結果が負でかつ、オーバーフローが発生していなければA<Bだから?分かりません。

  • このような計算はできるでしょうか?

    現在 「2バイトの数値」から「ビットが1である数」を求める 計算を行おうと思っています。 例えば、2バイトの数値が「222」の場合 →ビットに直すと「11011110」となり →ビットが1である数は「6」となります。 この計算をVBで行いたいのですが、 効率的に行える方法はないでしょうか? AND演算を行い1ビットずつカウントすると いう方法を考えたのすが、判定の時IF文がはいってしまうため 処理速度が遅くなり、困っております。 どなたか、お気づきの方はご教授ください。