• ベストアンサー

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

教えて下さい。 VBSで出来るだけ高速でローテート演算を行いたいです。 当方ではシフトJISの1バイトコード(16進数)を一度、10進数に直して さらにそこから2進数へ変換した後にローテートを行い、また10進数に直して~を行っています。 やはり処理に膨大な時間がかかってしまいます、、。 もっとスマートに素早く計算出来る方法があればご教示下さい。

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

  • ベストアンサー
回答No.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と考えれば、左の場合と同様な処理方法が見えてくるはず。

wansui
質問者

お礼

回答有難うございます。 ご教示頂きました通り、結果的に以下の処理にて解決出来たと思います。 【ローテート.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 )))) ------------------------------------------------------------ たぶん合ってると思いますが、どうでしょうか、、、?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.6

mビット左に回転ということは、 (1)上位mビットを(8-m)ビット右にシフト (2)下位(8-m)ビットをmビット左にシフト (3) (1)と(2)を加算 でいいですよね。 (1)は2^(8-m)で割った商 (2)は2^mをかけてから255とANDをとる で求まるんじゃないですか。

wansui
質問者

お礼

おはようございます! 回答ありがとうございました!^^ ご教示頂きました内容を元に、以下の式で求める事が出来ました。 【example_left.vbs】 ------------------------------------------------------------ n = "255" ' 10進数 m = 0 ' ローテート数 Msgbox Int(( n / 2 ^ ( 8 - m )) + ( n * 2 ^ m AND 255 )) ------------------------------------------------------------ 小数点は切り捨てるようにInt関数を使っています。 これで合ってると思いますが、、、どうでしょうか? あと右回転の場合はどーするんだろ、、、(=v=;

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

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

wansui
質問者

お礼

あ!すいません!w 間違ってたの僕のほうでした!!w マジすいません!! ほんとごめんなさいいいい!!!! どーやったらローテートできますかね?><; すいません、、、。

wansui
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

> 以下の式でビット左回転を実現する事が出来ました。 > > n = 10進数 > m = ローテート数 > > n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255))) できてない。

wansui
質問者

補足

> できてない。 えっと、君は頭弱いのかな?出来てますが? キミさ、8ビットの最大値はわかりまちゅか? 16進数のビット演算についてよくお勉強しなおしておいで…。 あとさ、回答にもならない回答しないでくれる? 文句つけたいだけのガキ(子供)ならどっかいけよ…。 時間の無駄だから…。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

10進数だの2進数だのが出てくるってことは、たぶん「文字列」に変換してから加工して、数値に戻すとかやってるんでしょう。 整数値を2で割ると、1ビット右にずらしたのと同じになります。 整数値を2で割った余りを求めると、一番右の1ビットを取り出すのと同じになります。 上位ビットを無視すれば、整数値に2をかけると1ビット左にずらしたのと同じになります。 整数値にAND演算子を使うと、特定のビットの値のを0にすることができます。 こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。

wansui
質問者

補足

> こういったものを使えば、文字列で加工するよりは速く処理できるでしょう。 あの…回答は嬉しいんですがタイトルの通り"ローテート演算"について質問しています。 誰もシフト演算の事なんて聞いてないっての…きちんと本文読んで回答して下さい…。 ついでに、補足です。 以下の式でビット左回転を実現する事が出来ました。 n = 10進数 m = ローテート数 n * 2 ^ m - (255 * (Int(n * 2 ^ m/ 255))) 次は右回転です…。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

wansui
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JISコードをシフトJISコードに変換する方法

    紙とえんぴつを使ってJISコードをシフトJISコードに変換する方法を教えてください。 たしか16進数の変換などを使って出来ると聞いたことがあります。 一文字の漢字だけで良いんです。 例えば『高』という漢字のJISコード「3962」をシフトJISコード「8D62」に変換したいというわけです。 2進数や16進数の計算の知識だけはあります。よろしくお願いします。

  • シフト演算を用いた変換

    シフト演算を用いて、データを変換したいのです。 例えば、「00 01 0B 0A」となっているデータを、「0A 0B 01 00」となるようにシフト演算を用いて、変換したいのです。 0Aで1byteとなっていて、1byteごとにデータを格納して入れ替えるなど、方法は考えてみたのですが、実際のプログラムがさっぱり思いつきません。 ヒントだけでもいいので、教えていただけると嬉しいです。 すみませんが、よろしくお願いします。

  • UTF-8で5~6バイトになる文字コード

    UnicodeのUTF-8で5~6バイトになる文字コードは、どのような場合でしょうか。(サロゲートペアのコードでも4バイトです。シフトJISから変換するとき、どのようなコードが5~6バイトに割り当てられるのでしょうか。) ご存知の方おられましたら、ご教示ください。

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • マイクロコンピュータ 乗算演算について

    マイクロコンピュータで、8ビット演算回路の乗算演算を行ったのですが、その際、乗数の0、1パターンに応じて被乗数を左シフトさせ加算していくロジックで演算をするというアルゴリズムを組み立てて実行しました。 乗算演算をより高速化させるには、この他にどのような手段が考えられるのか教えていただけないでしょうか? お願いいたします。

  • ビット演算子について

    あるプログラムの中で下記のようなif文の記述を見かけました。 どういう計算をしてif文の判定を行っているのでしょうか。 (1)256を2進数に変換して → 100000000 (2)0x00000004を2進数に変換して → 100 (3)100000000 & 100 のビットAND演算を行う そもそも(3)で100000000 と 100 では桁数が違うけどどうやって両者でビット演算するので しょうか。100を 000000100というように0を補完して計算すればよいのでしょうか。 その場合、100000000 & 000000100 → 000000000(2進数) → 0(10進数) となりif文の中には入らないことになると思います。 if(256 & 0x00000004 != 0)

  • [VBS] 16進数でバイナリファイル出力したい

    すいません、教えて下さい。 VBSを利用して16進数にてバイナリファイルを生成したいです。 例えばSJIS文字コードの文字列"あ"の場合だと16進数では"82A0"です。 その"82A0"を指定してバイナリファイル出力を行いたいです。 自分で色々と試しましたが、何故か出力ファイルの結果がバイナリで"81 45 A0"となってしまい 結果的に"あ"が表示されません、、、。 目的としてはVBSでビット演算子の論理和による暗号化を行いたいです。 申し訳ありませんが、ご教示頂ければ幸いです。

  • vbs xlsをcsvに変換

    vbsでxlsファイルをcsvファイルに変換することは可能でしょうか。 手動で拡張子をcsvにすると、カンマ区切りではないため 一列目にすべての値がスペース区切りで出力されてしまいます。 vbsで実行可能でしたらコードのご教示頂けますでしょうか。

  • 逆ポーランド記法における単項演算子などの処理

    開いていただきありがとうございます。 質問内容は題名の通りなのですが、 中置記法の式を逆ポーランド記法に変換して計算を行う際に単項演算子をどのように扱うかで悩んでいます。+-などのように文脈に応じて意味合いが変化するものもあり、もうひとつスマートに処理することができません。 また前置・後置インクリメントなどに対応するとしたらなおざりに処理するわけにもいきませんし、三項演算子に至ってはどのように処理すればいいのかさっぱりです。 電卓に留まらず、簡単な処理系に組み込むという前提で、これらをどのように使えばよいかご教示いただければと存じます。

  • 2進数データのビット演算

    vb.netにて 0と1からなる2進数で記録した2つの値をビット演算したいと思っております。 Convert.ToInt32("1111101000", 2) などを使って、一度数値に変換して演算すれば、計算可能なことはわかったのですが、計算に利用したいデータが2進数で1000桁ほどあります。桁数が多い場合、Convert.ToInt32ではエラーが出て実行できません。 無数に長い2進数のデータをビット演算するにはどうすればよろしいでしょうか。 ご存知の方、ご教授よろしくお願いいたします。