こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[VBS] 素早くローテート演算したい

教えて下さい。

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

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

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

投稿日時 - 2014-05-15 08:45:56

QNo.8595915

すぐに回答ほしいです

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

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と考えれば、左の場合と同様な処理方法が見えてくるはず。

投稿日時 - 2014-05-16 15:44:51

お礼

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

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

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

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

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

でいいですよね。

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

で求まるんじゃないですか。

投稿日時 - 2014-05-15 17:07:08

お礼

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

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

【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:37

ANo.5

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

投稿日時 - 2014-05-15 16:34:20

補足

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

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

投稿日時 - 2014-05-15 16:47:07

お礼

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

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


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

投稿日時 - 2014-05-15 16:53:53

ANo.4

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

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

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

できてない。

投稿日時 - 2014-05-15 16:03:12

補足

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

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

投稿日時 - 2014-05-15 16:20:46

ANo.3

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

投稿日時 - 2014-05-15 15:55:47

ANo.2

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

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

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

投稿日時 - 2014-05-15 15:08:49

補足

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


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

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

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

次は右回転です…。

投稿日時 - 2014-05-15 15:45:39

ANo.1

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

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

投稿日時 - 2014-05-15 11:01:06

補足

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

投稿日時 - 2014-05-15 14:27:55

あなたにオススメの質問