- ベストアンサー
[VBS] 素早くローテート演算したい
教えて下さい。 VBSで出来るだけ高速でローテート演算を行いたいです。 当方ではシフトJISの1バイトコード(16進数)を一度、10進数に直して さらにそこから2進数へ変換した後にローテートを行い、また10進数に直して~を行っています。 やはり処理に膨大な時間がかかってしまいます、、。 もっとスマートに素早く計算出来る方法があればご教示下さい。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
b1 b2 b3 b4 b5 b6 b7 b8 というビット並びを3ビット右回転すると、 b6 b7 b8 b1 b2 b3 b4 b5 となるわけだから、 b6 b7 b8 0 0 0 0 0 と 0 0 0 b1 b2 b3 b4 b5 を加算すれば求められる。 上は下位3ビットを5ビット左にシフトしているし、下は上位5ビットを右に3ビットシフトしている。 5=8-3と考えれば、左の場合と同様な処理方法が見えてくるはず。
その他の回答 (6)
- m-take0220
- ベストアンサー率60% (477/782)
mビット左に回転ということは、 (1)上位mビットを(8-m)ビット右にシフト (2)下位(8-m)ビットをmビット左にシフト (3) (1)と(2)を加算 でいいですよね。 (1)は2^(8-m)で割った商 (2)は2^mをかけてから255とANDをとる で求まるんじゃないですか。
お礼
おはようございます! 回答ありがとうございました!^^ ご教示頂きました内容を元に、以下の式で求める事が出来ました。 【example_left.vbs】 ------------------------------------------------------------ n = "255" ' 10進数 m = 0 ' ローテート数 Msgbox Int(( n / 2 ^ ( 8 - m )) + ( n * 2 ^ m AND 255 )) ------------------------------------------------------------ 小数点は切り捨てるようにInt関数を使っています。 これで合ってると思いますが、、、どうでしょうか? あと右回転の場合はどーするんだろ、、、(=v=;
- m-take0220
- ベストアンサー率60% (477/782)
なら、n=255で試してみれば?
お礼
あ!すいません!w 間違ってたの僕のほうでした!!w マジすいません!! ほんとごめんなさいいいい!!!! どーやったらローテートできますかね?><; すいません、、、。
補足
だからさ、、、、、何度言えばわかるのよ、、、、 ちゃんと本文読んでくださいよ、、、。 文字コード扱いたいって言ってるじゃんよ、、、。 16進数FF(255)は2進数で11111111でしょーが、、、、 も~、、ほんとなんなんこの人、、、、、、、
- m-take0220
- ベストアンサー率60% (477/782)
> 以下の式でビット左回転を実現する事が出来ました。 > > n = 10進数 > m = ローテート数 > > n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255))) できてない。
補足
> できてない。 えっと、君は頭弱いのかな?出来てますが? キミさ、8ビットの最大値はわかりまちゅか? 16進数のビット演算についてよくお勉強しなおしておいで…。 あとさ、回答にもならない回答しないでくれる? 文句つけたいだけのガキ(子供)ならどっかいけよ…。 時間の無駄だから…。
- m-take0220
- ベストアンサー率60% (477/782)
ローテートはシフトの組み合わせでできるでしょ。
- m-take0220
- ベストアンサー率60% (477/782)
10進数だの2進数だのが出てくるってことは、たぶん「文字列」に変換してから加工して、数値に戻すとかやってるんでしょう。 整数値を2で割ると、1ビット右にずらしたのと同じになります。 整数値を2で割った余りを求めると、一番右の1ビットを取り出すのと同じになります。 上位ビットを無視すれば、整数値に2をかけると1ビット左にずらしたのと同じになります。 整数値にAND演算子を使うと、特定のビットの値のを0にすることができます。 こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。
補足
> こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。 あの…回答は嬉しいんですがタイトルの通り"ローテート演算"について質問しています。 誰もシフト演算の事なんて聞いてないっての…きちんと本文読んで回答して下さい…。 ついでに、補足です。 以下の式でビット左回転を実現する事が出来ました。 n = 10進数 m = ローテート数 n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255))) 次は右回転です…。
- Tacosan
- ベストアンサー率23% (3656/15482)
VBS は使っていないのですが, 「配列」って存在しないんですか? それ以前に「シフトJISの1バイトコード(16進数)を一度、10進数に直してさらにそこから2進数へ変換した後にローテートを行い、また10進数に直して」がどういう操作なのか (そしてどうしてそんな操作をしているのか) さっぱり分からないんだけど.
補足
ビット演算について理解した上で回答して下さい。 いちいちアホな回答すんな、、、。
お礼
回答有難うございます。 ご教示頂きました通り、結果的に以下の処理にて解決出来たと思います。 【ローテート.vbs】 ------------------------------------------------------------ n = 255 ' 10進数 m = 0 ' ローテート数 '左回転式 Msgbox Int(( n / 2 ^ ( 8 - m )) + ( n * 2 ^ m AND 255 )) '右回転式 Msgbox ( n * 2 ^ ( 8 - m ) AND 255 ) + Int(( n / 2 ^ ( 8 - ( 8 - m )))) ------------------------------------------------------------ たぶん合ってると思いますが、どうでしょうか、、、?