次の方法で共有

VBA  ビット演算の仕方

Anonymous
2012-02-22T00:47:17+00:00

VBAでビット演算をする方法がよく分かりません。

例えば

Dim a As String

Dim b As String

Dim c As String

a = "010101"

b = "000111"

c = a And b

とすると

000101ではなく101になっています。

これだけであれば頭に0を付ける処理でなんとかなりますが

ビットの上下を逆にして

a = "101010"

b = "111000"

c = a And b

とすると

101000ではなく98448になっています??? (この現象がよく分かりません)

上記のANDのビット演算の結果を得るVBAの記述を教えてください。

よろしくお願い致します。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-02-24T06:03:42+00:00

公式にはVBAではビット演算は存在しないと思います。

ただし、

Sub xxx()

Dim x As Long, y As Long

x = 51200

y = 22531

MsgBox x And y

MsgBox x Or y

End Sub

こんなのでも一応結果は合っているようです。しかし誰も問題がないとは保証しないはずです。

(確認してませんが、多分31ビットまでの2進数なら対応できるんじゃないかと思います)

追記

なお、2進数の定数は16進数で設定できますこれは11111111をXに入れてます。

Sub aaa()

Dim X As Long

X = &HFF

MsgBox X

End Sub

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-03-01T13:25:08+00:00

>もっと簡単にできる方法などがありましたら教えてください。

そんなもんです。

ただ、ストリングにブランクが入ってるのが意図的なものでなければ、

  z = z & Trim(((Val(Mid(x, i, 1)) And Val(Mid(y, i, 1)))))

とした方が結果がすっきりするとおもいますよ。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

4 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2012-03-01T00:15:37+00:00

    y sakudaさん

    ありがとうございました。

    10進または16進のxとyをAND演算させて、その結果を10進または16進で得ることができるところまではなんとか理解できたのですが、2進数から10進数(16進数)にする部分と、演算結果を再び2進数に戻す部分が、AND演算をする部分よりも複雑になったので、最初に言われていました論理演算プロシージャを作成する方法で、2進数を文字列として扱い、1ビットずつ取り出して数値としてAND演算した結果を文字列として連結して結果を得るようにしてみました。

    Sub test()

      Dim a As String

      Dim b As String

      Dim c As String

      a = "101010"

      b = "111000"

      c = f(a, b)

      MsgBox c

    End Sub

    Public Function f(x As String, y As String) As String

      Dim i As Integer

      Dim z As String

      z = ""

      If Len(x) <> Len(y) Then

        MsgBox ("ERR")

        End

      Else

        For i = 1 To Len(x)

          z = z & Str((Val(Mid(x, i, 1)) And Val(Mid(y, i, 1))))

        Next i

        f = z

      End If

    End Function

    もっと簡単にできる方法や、文字列(String)ではなく数値(Longなど)を使用してもっと簡単にできる方法などがありましたら教えてください。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2012-02-24T04:15:46+00:00

    論理演算プロシージャを作らなくてもStringではなく別の型であれば

    前述のANDビット演算の結果を得ることができるのでしょうか。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2012-02-22T02:25:44+00:00

    VBAでStringのAndとかORなんか考えたこともないですので、推測です。

    結果が4桁を超えるとおかしくなるというようですので、4文字つまり32ビット(1ワード)を超えるものは何をやっているのか見当もつきません。

    少々無理筋ですので、ご自分でビット単位のArrayを対象として論理演算プロシージャを作成した方がよろしいかと思います。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません