FC2ブログ

Excelじゆうちょう

Excelのお絵描きツール『りっぷ2(りっぷつぅ)』のサポートページ、まずは「はじめに」をご覧ください。 [NewEntry] [Admin]

記事更新カレンダー

10 « 2018-11 « 12
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

拍手コメント一覧(拍手はしない)

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

pxivもやってます
リンクの一番上からのぞきに来てください
※閲覧にはユーザー登録が必要です

RSSってなんぞ?

広告は消せないらしい

FC2Ad

        --------       スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

        2010-11-18       論理演算子でRGB値操作まとめ

前回まで、RGB値を操作するという点に着目して論理演算子を紹介してきました。
まとめるとこんな感じです。

【And演算子】
  0 1 0 1(オペランド1)
And 0 0 1 1(オペランド2)
───────
  0 0 0 1(結果)
  必ず0 そのまま

【Or演算子】
  0 1 0 1(オペランド1)
Or 0 0 1 1(オペランド2)
───────
  0 1 1 1(結果)
そのまま 必ず1

【Xor演算子】
  0 1 0 1(オペランド1)
Xor 0 0 1 1(オペランド2)
───────
  0 1 1 0(結果)
そのまま 反転

【Eqv演算子】
  0 1 0 1(オペランド1)
Eqv 0 0 1 1(オペランド2)
───────
  1 0 0 1(結果)
  反転 そのまま

【Imp演算子】
  0 1 0 1(オペランド1)
Imp 0 0 1 1(オペランド2)
───────
  1 0 1 1(結果)
  反転 必ず1

【Not演算子】
Not 0 1 0 1(オペランド1)
───────
  1 0 1 0(結果)
  反転 反転

ビットの操作は(1)0にする、(2)1にする、(3)反転する、(4)そのまま変化なし、の4パターンでしたので、And演算子とOr演算子、Xor演算子があれば一通りまかなえます。
しかし、論理演算をする場合には特別に注意しなければならないことがあります。
それは、変数のデータ型です。

例えば、Integer型は16ビット(2バイト)の整数型で、Long型は32ビット(4バイト)の整数型です。
これは、2進数で表すとInteger型は16桁、Long型は32桁であることを意味します。
ですので、10進数の100を2進数で表現すると1100100の7桁になりますが、上位のビットは0が省略されているだけだと考えることができます。
省略された0のビットを補うと、Integer型では0000000001100100、Long型では00000000000000000000000001100100になってしまいます。
つまり、正確な結果を得るためには省略されているビットに注意しければならないのです。

具体例で確認してみましょう。
RGB値は24ビット必要ですので、Integer型では桁が足りません。
そのため、Long型の下位24ビットのみを使用します。
白をNot演算子で反転して、黒にしようとすると…

  ┏省略部┓┏青成分┓┏緑成分┓┏赤成分┓
Not 00000000 11111111 11111111 11111111
─────────────────────
  11111111 00000000 00000000 00000000

使用しない上位8ビットが反転してしまいました。
10進数で表すと、4278190080です。
RGB値の範囲は0~16777215でしたから、余裕で上限を超えてしまいました。
これでは、セルを塗りつぶす際にエラーが発生してしまいます。

うまい具合に、And演算子とOr演算子、Xor演算子はオペランド2のビットを1にしない限りオペランド1のビットを0から1にすることはありません。
これも、上で「ビットの操作は…And演算子とOr演算子、Xor演算子があれば一通りまかなえます」と述べた理由のひとつです。
スポンサーサイト

        2010-11-14       Imp演算子でRGB値操作

RGB値を操作する際、2進数で表現した時のビット単位で計算することが効果的です。
そこで使用するのが論理演算子で、今回はImp演算子を取り上げます。

この論理演算子はかなり特殊です。
これまで紹介してきたものは、オペランド1とオペランド2を入れ替えても結果は同じでした。

例えば、こんな感じです。
0 And 1 = 0と1 And 0 = 0
0 Xor 1 = 1と1 Xor 0 = 1

しかし、Imp演算子では結果が変わってしまうのです。
とりあえず、一覧で確認してみましょう。

第1オペ 第2オペ
ランド  ランド  結果
  0 Imp  0  =  1
  1 Imp  0  =  0
  0 Imp  1  =  1
  1 Imp  1  =  1

1 Imp 0は0ですが、0 Imp 1は1になってしまいます。
この結果を簡単に表現すると、こうなります。
オペランド1が1で、かつ、オペランド2が0場合のみ、0を返します。(それ以外は1を返します)

詳しい説明は置いておくとして、ここではこれまで通りオペランド2に注目して法則性を探しましょう。

第1オペ  第2オペ
ランド  ランド  結果
 0101 Imp 0011 = 1011

第2オペランドのビットが0ならば第1オペランドの対応する位のビットが反転して結果に返り、第2オペランドのビットが1ならば第1オペランドの対応する位のビットが1になって結果に返ります。

つまり、Eqv演算子とOr演算子を足して割ったような演算ができます。



最後にもうひとつ、ExcelVBAにはNot演算子という論理演算子があります。
こちらも一風変わっていて、オペランドをひとつしか取りません。
内容としてはすべてのビットを反転させるだけ、簡単です。

Not 0101 = 1010

動きとしては、Xor演算子のオペランド2にすべてのビットが1の値を使用した場合と同じですね。

        2010-11-08       Eqv演算子でRGB値操作

RGB値を操作する際、2進数で表現した時のビット単位で計算することが効果的です。
そこで使用するのが論理演算子で、今回はEqv演算子を取り上げます。

Xor演算子比べて一気に知名度が下がります、私も知りませんでした。
ですが、内容は単純です。
Xor演算子と逆の結果が返ります。

オペランド1とオペランド2のビットが等しい場合だけ1を返します。(それ以外は0を返します)

一覧にするとこんな感じです。

第1オペ 第2オペ
ランド  ランド  結果
  0 Eqv  0  =  1
  1 Eqv  0  =  0
  0 Eqv  1  =  0
  1 Eqv  1  =  1

Xor演算子 の場合と見比べれば、一目瞭然ですね。

第1オペ  第2オペ
ランド  ランド  結果
 0101 Eqv 0011 = 0110

第2オペランドのビットが0ならば第1オペランドの対応する位のビットが反転して結果に返り、第2オペランドのビットが1ならば第1オペランドの対応する位のビットがそのまま結果に返ります。
つまり、第2オペランドに0を指定した位の部分だけ、色を反転することができます。

使用例はもういいですね、スッパリ省略します。

Eqv演算子は、Xor演算子でほぼ完全に代用できます。
よって、私はたぶん使わないと思います。
でもまあ、ExcelVBAに備わってる論理演算子ですから、一応紹介だけはしておきました。

        2010-10-30       Xor演算子でRGB値操作

RGB値を操作する際、2進数で表現した時のビット単位で計算することが効果的です。
そこで使用するのが論理演算子で、今回はXor演算子を取り上げます。

これまでのAnd演算子とOr演算子に比べると若干知名度は下がりますが、少し変わった処理ができますので大変重要です。
別名、排他的論理和。
小難しそうな名前ですが、所詮はビットの演算です。
定義はこんな感じです。

オペランド1とオペランド2のビットが等しい場合だけ0を返します。(それ以外は1を返します)
※オペランドとは、演算に使用される値のこと
一覧にするとこんな感じです。

第1オペ 第2オペ
ランド  ランド  結果
  0 Xor  0  =  0
  1 Xor  0  =  1
  0 Xor  1  =  1
  1 Xor  1  =  0

オペランド2に注目して法則性を見つけます。

第1オペ  第2オペ
ランド  ランド  結果
 0101 And 0011 = 0110

第2オペランドのビットが0ならば第1オペランドの対応する位のビットがそのまま結果に返り、第2オペランドのビットが1ならば第1オペランドの対応する位のビットが反転して結果に返ります。
つまり、第2オペランドに1を指定した位の部分だけ、色を反転することができます。

使用例を見てみましょう。
黒はすべての色成分が0でした、ここにXor演算子で赤を加えてみます。

   00000000 00000000 00000000 (黒)
Xor 00000000 00000000 11111111 ()
──────────────────
   00000000 00000000 11111111

黒の赤成分だけがビット反転し、その結果になりました。
この結果にさらに、Xor演算子でを加えます。

   00000000 00000000 11111111 ()
Xor 11111111 11111111 11111111 ()
──────────────────
   11111111 11111111 00000000

はすべてのビットが1ですので、のすべての色成分がビット反転されました。
得られた色はシアンです、色相環でいうところの補色にあたります。
すべてのビットが反転したせいで、反対の色になってしまったんですね。

Xor演算子は特定の色のビットを反転させてしまいますので、うっかりしてるとショッキングな色ができあがってしまいがちです。
使い方は少し難しいですが、And演算子ともOr演算子とも一味違う処理が可能となります。



Xor演算子の名前について、「or」が含まれてますね。
別名も「排他的論理和」で、「論理和」が含まれてます。
その名の通り、論理和が排他的になってるのです。

論理和 0 Xor 0 = 0
    1 Xor 0 = 1
    0 Xor 1 = 1
    1 Xor 1 = 1←Xorの場合ここが0

同じ1どうしは除外して0になる、そこが排他的なのです。
ちなみに、これを図示すると以下のように表せます。

↓ベン図で排他的論理和↓
排他的論理和

これは、ベン図という表記方法です。
Aの円が第1オペランドでBの円が第2オペランドになり、それぞれの円の外側が0で内側が1です。
円が重なる部分が排他的になって、ぽっかり筒抜けになってしまってます。

転げた民主党のまがい物に見えるのは私だけ…?

        2010-10-28       Or演算子でRGB値操作

RGB値を操作する際、2進数で表現した時のビット単位で計算することが効果的です。
そこで使用するのが論理演算子で、今回はOr演算子を取り上げます。

Or演算子、別名論理和の定義はこんな感じです。

第1オペランドと第2オペランドが共に0の場合だけ、0を返します。(それ以外は1を返します)
※オペランドとは、演算に使用される値のこと
一覧にするとこんな感じです。

第1オペ 第2オペ
ランド  ランド  結果
  0  Or  0  =  0
  1  Or  0  =  1
  0  Or  1  =  1
  1  Or  1  =  1

前回のAnd演算子とよく似てますね。
考え方は同じです、オペランド2に注目して法則性を見つけます。

第1オペ  第2オペ
ランド  ランド  結果
 0101 And 0011 = 0111

第2オペランドのビットが0ならば第1オペランドの対応する位のビットがそのまま結果に返り、第2オペランドのビットが1ならば第1オペランドの対応する位のビットが1になって結果に返ります。
つまり、第2オペランドに1を指定した位の部分だけ、色成分を強調することができます。

具体的に見てみましょう。
各色成分が0のRGB値は黒になります、ここにOr演算子でを加えます。

  00000000 00000000 00000000 (黒)
Or 00000000 00000000 11111111 ()
──────────────────
  00000000 00000000 11111111

になりました。
続いて、もOr演算子で加えます。

  00000000 00000000 11111111 ()
Or 00000000 11111111 00000000 ()
──────────────────
  00000000 11111111 11111111

この色はです。
さらに、も加えます。

  00000000 11111111 11111111 ()
Or 00000000 10000000 11111111 ()
──────────────────
  00000000 11111111 11111111

のままで変化はありませんでした。
このことから、を含んでいるということがわかります。
すでにピンときている方もいるかもしれませんが、Or演算子では色を明るくすることはできても、暗くすることはできません。
オペランド1のビットを0から1にすることはできても、0から1にすることはできないからです。

古い記事  | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。