Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4105 / 13644 ツリー ←次へ | 前へ→

【58241】bit演算??? 向井 08/10/13(月) 19:49 質問[未読]
【58242】Re:bit演算??? ベンセンヘイバー 08/10/13(月) 21:47 発言[未読]
【58293】Re:bit演算??? 向井 08/10/16(木) 20:21 質問[未読]
【58298】Re:bit演算??? neptune 08/10/16(木) 22:17 発言[未読]
【58305】Re:bit演算??? ハチ 08/10/17(金) 13:40 発言[未読]
【58311】Re:bit演算??? 向井 08/10/17(金) 23:39 質問[未読]
【58365】Re:bit演算??? ハチ 08/10/21(火) 12:33 発言[未読]
【58249】Re:bit演算??? ハチ 08/10/14(火) 14:31 発言[未読]
【58294】Re:bit演算??? 向井 08/10/16(木) 20:36 お礼[未読]
【58310】Re:bit演算??? 向井 08/10/17(金) 23:38 質問[未読]
【58312】Re:bit演算??? neptune 08/10/18(土) 0:01 発言[未読]
【58354】Re:bit演算??? 向井 08/10/21(火) 0:15 発言[未読]
【58355】Re:bit演算??? ichinose 08/10/21(火) 7:57 発言[未読]
【58359】Re:bit演算??? 向井 08/10/21(火) 9:52 発言[未読]
【58362】Re:bit演算??? ichinose 08/10/21(火) 11:10 発言[未読]
【58375】Re:bit演算??? 向井 08/10/22(水) 0:41 発言[未読]
【58410】Re:bit演算??? 向井 08/10/24(金) 0:09 お礼[未読]

【58241】bit演算???
質問  向井  - 08/10/13(月) 19:49 -

引用なし
パスワード
   ビット計算(演算)が分かりません。
うまく説明できないのですが、
変数を一つ用意して、その変数に「Or」で数字を足して(?)いく。

たとえばAという変数があり初期値は「0」。

A = A Or 1
をやるとAは1になる。

次にA =A Or 2 とすると、Aは3になる。
A = A Or 3 でAは3・・・
このようにOr n のnをインクリメントさせていき
Aの値を変化させたいのですが、A = nになるようにさせたい。

1bit目が空いていたらそこを立てる、
1bit目が立っていて、2bitが空いていたら1bit目を0にして2bit目を立てる。
という風に条件を与えたいのですが分かりません。
どなたかご教授くださいm(_ _)m

【58242】Re:bit演算???
発言  ベンセンヘイバー  - 08/10/13(月) 21:47 -

引用なし
パスワード
   初めまして こんばんは

>このようにOr n のnをインクリメントさせていき
>Aの値を変化させたいのですが、A = nになるようにさせたい。

???
n=1 の時点で すでに A = n という結果になりますよね?
n がどんな値になっても、 A Or n による結果が A = n となるように計算を工夫せよという事なのでしょうか?


>1bit目が空いていたらそこを立てる、
>1bit目が立っていて、2bitが空いていたら1bit目を0にして2bit目を立てる。

これって普通に数値の1をどんどん加算させていく処理ですよね・・?

最終的にビット演算で何をやりたいのでしょうか?
質問の意味をはき違えていたらごめんなさい。

【58249】Re:bit演算???
発言  ハチ  - 08/10/14(火) 14:31 -

引用なし
パスワード
   ▼向井 さん:
>ビット計算(演算)が分かりません。

3 Or 3 = 3 になるのがわからないということですか?
ビット演算の場合は、2進数に変換して1ビットづつ演算することになります。
0011 Or
0011 のOr演算は、
0011

>1bit目が空いていたらそこを立てる、
>1bit目が立っていて、2bitが空いていたら1bit目を0にして2bit目を立てる。
>という風に条件を与えたいのですが分かりません。

ベンセンヘイバーさんも書かれているように、
Or演算子ではなくて、+演算子だと思います。

それともこのアルゴリズムを自作したいということですか?

【58293】Re:bit演算???
質問  向井 E-MAIL  - 08/10/16(木) 20:21 -

引用なし
パスワード
   ▼ベンセンヘイバー さん:
こんばんは

>n=1 の時点で すでに A = n という結果になりますよね?
>n がどんな値になっても、 A Or n による結果が A = n となるように計算を工夫せよという事なのでしょうか?

そうです。
Aが1の時、2でOrをとると3になる。
この時2になるようにしたいんです。。。


>>1bit目が空いていたらそこを立てる、
>>1bit目が立っていて、2bitが空いていたら1bit目を0にして2bit目を立てる。
→これができれば成立するのではと思ったのですが。。。

【58294】Re:bit演算???
お礼  向井 E-MAIL  - 08/10/16(木) 20:36 -

引用なし
パスワード
   ▼ハチ さん:
こんばんは。
>3 Or 3 = 3 になるのがわからないということですか?
>ビット演算の場合は、2進数に変換して1ビットづつ演算することになります。
>0011 Or
>0011 のOr演算は、
>0011
→ありがとうございます。ここは分かります。

【58298】Re:bit演算???
発言  neptune  - 08/10/16(木) 22:17 -

引用なし
パスワード
   ▼向井 さん:
こんにちは

何に使うか目的を書けばもっと良いアドバイスを受けられると思いますが。

>>>1bit目が空いていたらそこを立てる、
>>>1bit目が立っていて、2bitが空いていたら1bit目を0にして2bit目を立てる。
>→これができれば成立するのではと思ったのですが。。。
例えば
?3 xor 1
2
となります。1減ってますよね。2進数で書くと
  11
xor 1
------
  10
って事じゃ駄目ですか?このような考え方で各ビットを判断する関数を
作るしかないと思います。andでもorでも好きなものを使ってです。

質問の意味自体が良くわからんまま思いつきで書いてますので、
全くのはずしならごめん。

【58305】Re:bit演算???
発言  ハチ  - 08/10/17(金) 13:40 -

引用なし
パスワード
   ▼向井 さん:

良くわかりませんが・・・

>Aが1の時、2でOrをとると3になる。
>この時2になるようにしたいんです。。。

x Or 2 = 2 となる演算だと、
xは、0 か 2 しかないと思いますけど。

「なるようにしたい」との事ですが、
これは、
「2になるようにAの値を調整したい」ですか?

それとも、
「2になるような演算式がしりたい」ですか?

'そのまんま・・
A = n

'0とOrする。意味ないですけど
A = (A And 0) Or n

'パリティを生成して戻す
buf = A Xor n
A = buf Xor A

【58310】Re:bit演算???
質問  向井  - 08/10/17(金) 23:38 -

引用なし
パスワード
   皆さん、こんな分かりにくい質問にレスありがとうございます。
最初から説明します。

演習問題で、変数RIdxをループで1〜40までまわして
その時の10の位をA列に、1の位をB列に表示させる。
さらに16の倍数の時はA列に上位4ビットを、B列に下位4ビットを
それぞれ表示させる。

Public Sub ensyu_3()

  Dim RIdx As Long
  
    
  For RIdx = 1 To 40
  Cells(RIdx, 1).Value = RIdx
  
    Cells(RIdx, 2).Value = (RIdx And &HF0) / &H10
    
    Cells(RIdx, 3).Value = RIdx And &HF
    
  Next RIdx
  
End Sub

この内容と同じものを、もう一つ変数を用意し(たとえばA)
Aを1から40までまわして、[RIdx Or A]でRIdxを増やしていき
同じ結果をだしたいのです。

そうするとRIdxが1の時A=2でOrをとるとRidxは3になってしまう。
これを防ぐために1ビット目があいているか、2ビット目が空いているか・・・
を見ていきたいのです。

【58311】Re:bit演算???
質問  向井  - 08/10/17(金) 23:39 -

引用なし
パスワード
   ▼ハチ さん:
>▼向井 さん:
>
>「2になるようにAの値を調整したい」ですか?
>
>それとも、
>「2になるような演算式がしりたい」ですか?

2になるような演算式が知りたいです。

【58312】Re:bit演算???
発言  neptune  - 08/10/18(土) 0:01 -

引用なし
パスワード
   ▼向井 さん:

>ビット目があいているか、2ビット目が空いているか・・・
>を見ていきたいのです。
そのヒントとなるものは、私は先のResで書いたつもりです。(多分ですけどね)
考え方を利用して必要な関数を書けばできるとは思いますが、
そのようなやり方は本来の筋から外れているような気がします。

自分で必要な機能を作る以外の方法はVBでは無いです。

演習問題という事なので私の書き込みは先のヒントまでとします。

【58354】Re:bit演算???
発言  向井  - 08/10/21(火) 0:15 -

引用なし
パスワード
   Public Sub ensyu_4()

  Dim Atai As Long
  Dim RIdx As Long
  
  RIdx = 0

  For Atai = 1 To 40
  
  '0
  If ((RIdx And 1) = 0) Then
      RIdx = RIdx Or Atai
  '1bit立・2bit空
  ElseIf ((RIdx And 1) = 1) And ((RIdx And 2) = 0) Then
      RIdx = RIdx Xor 3
      RIdx = RIdx Or Atai
    
  '1bit立・2bit立・3bit空
  ElseIf ((RIdx And 1) = 1) And ((RIdx And 2) = 2) And ((RIdx And 4) = 0) Then
      RIdx = RIdx Xor 3
      RIdx = RIdx Or Atai
      
  '1bit立・2bit立・3bit立・4bit空
  ElseIf ((RIdx And 1) = 1) And ((RIdx And 2) = 2) And ((RIdx And 4) = 4) And ((RIdx And 8) = 0) Then
      RIdx = RIdx Xor 7
      RIdx = RIdx Or Atai
  End If

  Cells(Atai, 1).Value = RIdx


  Next Atai

End Sub

こんな風に書いてみたのですが・・・
力技でしょうか?

また、4bitまでしか確認できないので
上位・下位を分けて考えたいと思っているのですが
RIdx Mod 16では分けることはできないのでしょうか?

【58355】Re:bit演算???
発言  ichinose  - 08/10/21(火) 7:57 -

引用なし
パスワード
   おはようございます。

>
>Public Sub ensyu_3()
>
>  Dim RIdx As Long
>  
>    
>  For RIdx = 1 To 40
>  Cells(RIdx, 1).Value = RIdx
>  
>    Cells(RIdx, 2).Value = (RIdx And &HF0) / &H10
>    
>    Cells(RIdx, 3).Value = RIdx And &HF
>    
>  Next RIdx
>  
>End Sub
>
>この内容と同じものを、もう一つ変数を用意し(たとえばA)
>Aを1から40までまわして、[RIdx Or A]でRIdxを増やしていき
同じ結果を論理演算子を使って出したいということですか?


Sub ensyu_4()

  Dim Atai As Long
  Dim RIdx As Long
 
  Atai = 0

  For RIdx = 1 To 40
  
    Atai = Atai Xor (RIdx Xor (RIdx - 1))
    Cells(RIdx, 1).Value = Atai
    Cells(RIdx, 2).Value = (Atai And &HF0) / &H10
    Cells(RIdx, 3).Value = Atai And &HF
  Next RIdx

End Sub

【58359】Re:bit演算???
発言  向井  - 08/10/21(火) 9:52 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。

レスありがとうございます。

>同じ結果を論理演算子を使って出したいということですか?

そうです。
書いていただいたのを試したのですが
チョット結果が違うようです。。。

また夜に勉強させていただきます。
出勤前ですのでまずはお礼まで。

【58362】Re:bit演算???
発言  ichinose  - 08/10/21(火) 11:10 -

引用なし
パスワード
   >そうです。
>書いていただいたのを試したのですが
>チョット結果が違うようです。。。

ん?、
>Public Sub ensyu_3()
省略


  
>End Sub

>この内容と同じものを、もう一つ変数を用意し(たとえばA)
>Aを1から40までまわして、[RIdx Or A]でRIdxを増やしていき
>同じ結果をだしたいのです。
と記述されていますよね?

向井さんが投稿された上記コードと同じ動作になりませんか?

【58365】Re:bit演算???
発言  ハチ  - 08/10/21(火) 12:33 -

引用なし
パスワード
   ▼向井 さん:

質問の内容がイマイチ理解できませんでした。
いろいろサンプルを書いてみました。


'こういうことですか?
Sub test()
  Dim i As Long
  Dim A As Long
  
  For i = 1 To 40
    A = A And i
    Debug.Print "i=" & i & " : " & "A=" & A
    A = A Or i
    
    If i = A Then
      Debug.Print i & ":OK"
    Else
      Debug.Print i & ":NG"
    End If
    Debug.Print
  Next
End Sub


Sub test1()
  Dim i As Long
  Dim buf As Long
  
  For i = 0 To 40
    buf = i Xor &HFF
    
    MsgBox i & "の2進:" & func_10to2(i) & vbCr & _
     buf & "の2進:" & func_10to2(buf)
  Next
End Sub

Sub Test2()
  Dim H As Long  'Highの意
  Dim L As Long  'Lowの意
  Dim i As Long
  
  For i = 0 To 40
    H = i And &HF0
    L = i And &HF
    MsgBox i & "のHigh:" & func_10to2(H) & vbCr & _
     i & "のLow:" & func_10to2(L)
  Next
End Sub

Private Function func_10to2(ByVal arg As Long) As String
  Dim buf As String
  Dim i As Long
  
  i = 0
  Do Until arg = 0
    If arg And 2 ^ i Then
      buf = "1" & buf
      arg = arg - 2 ^ i
    Else
      buf = "0" & buf
    End If
    i = i + 1
  Loop
  If Len(buf) < 8 Then
    buf = WorksheetFunction.Rept("0", 8 - i) & buf
  End If
  
  func_10to2 = buf
End Function

【58375】Re:bit演算???
発言  向井  - 08/10/22(水) 0:41 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは。
すみません、同じ結果になっていました。
私の確認不足でした。
今作っているのが下に記述してものだったので
ごっちゃになっていました。
Public Sub ensyu_2()

  Dim RIdx As Long
  
    
  For RIdx = 1 To 40
  Cells(RIdx, 1).Value = RIdx
  
  If ((RIdx Mod 16) = 0) Then
    Cells(RIdx, 2).Value = (RIdx / 16) And 15
    Cells(RIdx, 3).Value = RIdx And 0
    
  Else
    Cells(RIdx, 2).Value = Fix(RIdx / 10)
    Cells(RIdx, 3).Value = RIdx Mod 10
  End If
    
  Next RIdx
  
End Sub

【58410】Re:bit演算???
お礼  向井  - 08/10/24(金) 0:09 -

引用なし
パスワード
   ▼ichinose さん:
いつもありがとうございます。
教えていただいたものでうまくいきました。

もっと勉強してシンプルにかけるように
なりたいと思います。

4105 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free