dポイントプレゼントキャンペーン実施中!

教えて下さい。

VBSで出来るだけ高速でローテート演算を行いたいです。

当方ではシフトJISの1バイトコード(16進数)を一度、10進数に直して
さらにそこから2進数へ変換した後にローテートを行い、また10進数に直して~を行っています。
やはり処理に膨大な時間がかかってしまいます、、。

もっとスマートに素早く計算出来る方法があればご教示下さい。

A 回答 (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と考えれば、左の場合と同様な処理方法が見えてくるはず。
    • good
    • 2
この回答へのお礼

回答有難うございます。
ご教示頂きました通り、結果的に以下の処理にて解決出来たと思います。

【ローテート.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 ))))
------------------------------------------------------------

たぶん合ってると思いますが、どうでしょうか、、、?

お礼日時:2014/05/19 16:18

mビット左に回転ということは、



(1)上位mビットを(8-m)ビット右にシフト
(2)下位(8-m)ビットをmビット左にシフト
(3) (1)と(2)を加算

でいいですよね。

(1)は2^(8-m)で割った商
(2)は2^mをかけてから255とANDをとる

で求まるんじゃないですか。
    • good
    • 0
この回答へのお礼

おはようございます!
回答ありがとうございました!^^

ご教示頂きました内容を元に、以下の式で求める事が出来ました。

【example_left.vbs】
------------------------------------------------------------
n = "255" ' 10進数
m = 0 ' ローテート数

Msgbox Int(( n / 2 ^ ( 8 - m )) + ( n * 2 ^ m AND 255 ))
------------------------------------------------------------

小数点は切り捨てるようにInt関数を使っています。
これで合ってると思いますが、、、どうでしょうか?
あと右回転の場合はどーするんだろ、、、(=v=;

お礼日時:2014/05/16 08:51

なら、n=255で試してみれば?

この回答への補足

だからさ、、、、、何度言えばわかるのよ、、、、
ちゃんと本文読んでくださいよ、、、。
文字コード扱いたいって言ってるじゃんよ、、、。
16進数FF(255)は2進数で11111111でしょーが、、、、

も~、、ほんとなんなんこの人、、、、、、、

補足日時:2014/05/15 16:47
    • good
    • 0
この回答へのお礼

あ!すいません!w
間違ってたの僕のほうでした!!w
マジすいません!!

ほんとごめんなさいいいい!!!!


どーやったらローテートできますかね?><;
すいません、、、。

お礼日時:2014/05/15 16:53

> 以下の式でビット左回転を実現する事が出来ました。



> n = 10進数
> m = ローテート数

> n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255)))

できてない。

この回答への補足

> できてない。
えっと、君は頭弱いのかな?出来てますが?
キミさ、8ビットの最大値はわかりまちゅか?
16進数のビット演算についてよくお勉強しなおしておいで…。

あとさ、回答にもならない回答しないでくれる?
文句つけたいだけのガキ(子供)ならどっかいけよ…。
時間の無駄だから…。

補足日時:2014/05/15 16:20
    • good
    • 0

ローテートはシフトの組み合わせでできるでしょ。

    • good
    • 0

10進数だの2進数だのが出てくるってことは、たぶん「文字列」に変換してから加工して、数値に戻すとかやってるんでしょう。



整数値を2で割ると、1ビット右にずらしたのと同じになります。
整数値を2で割った余りを求めると、一番右の1ビットを取り出すのと同じになります。
上位ビットを無視すれば、整数値に2をかけると1ビット左にずらしたのと同じになります。
整数値にAND演算子を使うと、特定のビットの値のを0にすることができます。

こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。

この回答への補足

> こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。
あの…回答は嬉しいんですがタイトルの通り"ローテート演算"について質問しています。
誰もシフト演算の事なんて聞いてないっての…きちんと本文読んで回答して下さい…。


ついでに、補足です。
以下の式でビット左回転を実現する事が出来ました。

n = 10進数
m = ローテート数

n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255)))

次は右回転です…。

補足日時:2014/05/15 15:45
    • good
    • 0

VBS は使っていないのですが, 「配列」って存在しないんですか?



それ以前に「シフトJISの1バイトコード(16進数)を一度、10進数に直してさらにそこから2進数へ変換した後にローテートを行い、また10進数に直して」がどういう操作なのか (そしてどうしてそんな操作をしているのか) さっぱり分からないんだけど.

この回答への補足

ビット演算について理解した上で回答して下さい。
いちいちアホな回答すんな、、、。

補足日時:2014/05/15 14:27
    • good
    • 0

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