- - PR -
ページにアクセス権を設定したいのですが(ASP.NET VB)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-28 15:21
こんにちは。
>大きな数字から引いていけばいいんじゃないですか? >引いてマイナスにならなければ権限はあるんですよね。 すいません。今ひとつわからないです。 例えば、 2と8に権限を与えたくて、合計値として10を設定した場合、 1と4もマイナスにはならなくなってしまうんじゃないかと思うのですが。 やっぱり私の説明と理解度が不足しているのでしょうね。 上手く説明できているかどうかわからないですが、 1,2,4,8,16の数字を任意の組み合わせ(1と8とか、2と8と16とか)で足した合計から、 1,2,4,8,16のうちの特定の値が含まれているかどうかを判定したいのです。 例えば26という値があって、その中に4は含まれているかどうかを調べたいのです。 すいません。数学はさっぱりです。 | ||||
|
投稿日時: 2007-06-28 15:34
大きい数から順に引いていけばいいだけなのでは??
例)26の場合
てかこういうことは、周囲の人に聞いたほうが早いですよ。 [ メッセージ編集済み 編集者: burton999 編集日時 2007-06-28 15:35 ] | ||||
|
投稿日時: 2007-06-28 15:40
提示されたソースは読んでいませんが、VBではビット演算ができないと思っていらっしゃいますか?
OR演算したものが元の値と等しければ、そのビットはすでに立っていたと判断できます。 | ||||
|
投稿日時: 2007-06-28 15:59
ありがとうございます。
恐れ入ります。 >Dim a, b As Integer >a = 26 >b = 4 >Console.Write(b.ToString() & "は" & a.ToString() & "に") >If (a Or b) = a Then > Console.WriteLine("含まれる") >Else > Console.WriteLine("含まれない") >End If ビット演算というのを言葉しか知らないのですが、 何だか拍子抜けするくらいあっさり判断できるのですね。 それに、 >step1 : 26 - 16 = 10 //マイナスにならないので、16の権限はある。 >step2 : 10 - 8 = 2 //マイナスにならないので、8の権限はある。 >step3 : 2 - 4 = -2 //マイナスなので4の権限はない。 >step4 : 2 - 2 = 0 //マイナスにならないので、2の権限はある。 これも、実際に計算してみて、目から鱗です。 ・・・これをどうやってコードにするのか、私にはわからなくて情けない限りですが・・・。 | ||||
|
投稿日時: 2007-06-28 16:05
ソースを<del>水煮</del>見ずに、だとちょっと失礼かも?と思いつつソ
ースリストを眺めてみましたが、不確定要素(リスト中で宣言されていない 変数など)が多すぎて、全然参考になりませんでしたとさ。 仕方がないので、みなさんの回答を拝見しつつどんなことをやろうとしてい るのかをイメージしてみましたが、ビット演算でできそうな気がします。 で、スレ主さんはもしかするとビット演算という言葉からしてご存知ないの かな?と(加減算でなんとかしようとしている節がありますし)。 # と書いていたらそんな投稿がされてますね というわけで、ビット演算について調べてみると幸せになれそうです。 でもビット演算以外にも、我々には未知の部分(スレ主さんが説明し切れ ていないので)が多すぎるということもあるので
これに一票入れておきます。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2007-06-28 16:23
それでは、私は全くプログラミングできませんってことになります。 正解のコードを書くのは簡単ですが、この掲示板はそういう場所ではないと私は思ってます。 さよこ氏がどのような状況かは知りませんが、書籍でも買って基礎から学ばれることをオススメします。 | ||||
|
投稿日時: 2007-06-28 18:14
こんばんは。
>それでは、私は全くプログラミングできませんってことになります。 >正解のコードを書くのは簡単ですが、この掲示板はそういう場所ではないと私は思って>ます。 >さよこ氏がどのような状況かは知りませんが、書籍でも買って基礎から学ばれることを>オススメします。 情けない限りです。 こんな感じでしょうか。 Dim intAuth(1,4) As Integer Dim intPerm As Integer = 26 Dim intTmp, i As Integer 〜intAuthに権限コードを入れる〜 For i = 0 To intAuth.GetUpperBound(1) intTmp = intPerm - intAuth(0, i) If intTmp >= 0 Then intAuth(1, i) = 1 intPerm = intTmp Else intAuth(1, i) = 0 End If Next 〜自分の権限コードと比較して、1だったら許可〜 | ||||
|
投稿日時: 2007-06-28 20:19
「権限コードの合計が他の権限コードと重複することは無い」とか書いてあるので、そもそもなぜ「1, 2, 4, 8, 16」を使うのか、わかっていないんじゃない?
> 例えば26という値があって、その中に4は含まれているかどうかを調べたいのです。 2進数で考えます。10になるときに繰り上がる10進数、つまり普段使っている数と違い、2進数は2になるときに繰り上がります。つまり、1, 2, 3 はそれぞれ、1, 10, 11 となります。4 は 100 ね。1と0しかない、つまり、ON/OFF の世界です。 これを 1, 2, 4, 8, 16 と並べて書くと、 _1_____1 _2____10 _4___100 _8__1000 16_10000 となります。これで、どの組み合わせを足しても他の権限とぶつからない理由がわかりますか?10進数でいうと、1, 10, 100, 1000, 10000 を足しているわけです。ぶつかりませんよね? というわけで、intAuth(0, i) などと配列にせずとも、UserAuth と、ひとつの変数ですべての権限を表すことが可能になります。 ですから、2進数に変換して、4を使っているかどうかを調べればよい、ということです(burton999さんの方法)。「基数変換」で調べてください。 26を2進数にすると、11010。4を2進数にすると、100。4は右から3桁目で、26では3桁目は0なので、「権限がない」と判断できます。 が、そんな面倒なことをしなくても、コンピュータの中では2進数なのですから、便利な演算子が用意されています(一郎さんの方法)。「論理演算子」で調べてください。 人の目には26のまま、11010と100の論理和(OR)を計算すると、11110になります。元の数字と結果が変わっているため、「権限がない」と判断できます。 ただ、論理和を使う方法は、ユーザに与えられる権限が1つに限るときのみ、有効です。つまり、ユーザの権限が8と4で12だったとすると、11010 or 1100 = 11110 となり、本当は権限があるのに、「権限がない」と判断されます。(こっちじゃないかと思うのだが?) ちなみに、burton999さんの最初の返答にある「共通型システムの列挙型」というのは、ここまですべて含んでいます。 まぁ、1, 2, 4, 8, 16 の段階で「なぜこの数字なのですか?」と尋ねていたら、しなくて良い悩みだったでしょうね。 あと、コードを載せられても困ります。ぽぴ王子様がおっしゃっているように、書かれていないことについて想像力をたくましくしなければなりません。 また、思っていることと実行結果が一致しないから質問に至ったのだと思います。しかし、コードはあなたの思っていることをあらわしてはいません。 「プログラムは、思っているとおりには動かない。書かれているとおりに動く。」 という言葉があります。 思っていることと、書かれていることの差。それが「バグ」です。 あなたも、「少なくとも頭の中では判定できるのですが」と書かれているとおりです。 あなたが頭の中でしていることと、書かれていることの差はなんなのか。それを見つけなければなりません。 しかし、私たちにそれはできません。あなたの頭の中を覗いてみることはできないからです。 [ メッセージ編集済み 編集者: Jitta 編集日時 2007-06-28 21:46 ] |