[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/03/10(Thu) 10:08
投稿者名:ダンボ
URL :
タイトル:
ビット操作で納得いかないことが
お早うございます。
色操作をしたいので各色を下記で取り出そうとしたが、正しく取り出せない場合があります。
突き詰めていくと、デバッグウィンドウで試してみると
?hex(&H7F8180 / &H100)の結果が7F82
?hex(&H7F817F / &H100)の結果が7F81
でした。上段の結果が納得いかないです。
切り捨てられたはずの最後のビットがその上のビットに影響している。四捨五入?そうとしか考えられない。
皆さんだったら、どうコーディングしますか?

Dim R As Integer, G As Integer, B As Integer
B = (Label1.BackColor / &H10000) And &HFF
G = (Label1.BackColor / &H100) And &HFF
R = Label1.BackColor And &HFF

投稿時間:2005/03/10(Thu) 10:33
投稿者名:ダンボ
URL :
タイトル:
【解決】ビット操作で納得いかないことが
\演算子を使うと正しく行きました。やはり四捨五入だったのかな。

Dim R As Integer, G As Integer, B As Integer
B = (Label1.BackColor \ &H10000) And &HFF
G = (Label1.BackColor \ &H100) And &HFF
R = Label1.BackColor And &HFF

投稿時間:2005/03/10(Thu) 11:08
投稿者名:Say
Eメール:
URL :
タイトル:
Re: 【解決】ビット操作で納得いかないことが
> \演算子を使うと正しく行きました。やはり四捨五入だったのかな。
四捨五入ではありません。銀行丸めです。
&H7F8280 / &H100 = &H7F82
&H7F8180 / &H100 = &H7F82
&H7F8080 / &H100 = &H7F80

投稿時間:2005/03/10(Thu) 11:35
投稿者名:ダンボ
URL :
タイトル:
「銀行丸め」
Say さん、いつもお世話になっております。

> 四捨五入ではありません。銀行丸めです。

「銀行丸め」聞いたことはあるなあ、という程度なので、復習をしました。
(単なる憶測)/演算子が「銀行丸め」を採用した背景はファームウェアのアルゴリズムで一番速いのかな

hhttp://support.microsoft.com/default.aspx?scid=kb;ja;418216
Office 2000 より VBA には Round 関数が追加されました。VBA の Round 関数は、"算術型" の丸め処理では
なく "銀行型" の丸め処理を行います。
"算術型" の丸め処理では ".5" は常に切り上げられますが、"銀行型" の丸め処理の場合は ".5" は、結果が偶
数になるように丸め処理が行われ、切り上げられることも、切り捨てられることもあります。
"算術型" と "銀行型" の丸め処理の違いは、以下の表のようになります。
    数値   算術型   銀行型 (VBA)
  -----------------------------
    1.5     2        2
    2.5     3        2
    3.5     4        4
    4.5     5        4
    5.5     6        6
    6.5     7        6

hhttp://support.microsoft.com/default.aspx?scid=kb;ja;196652
丸めを行った値どうしを加えるとき、.5 を常に同じ方向に丸めると、加える値が多くなるにつれて値の偏りが大
きくなります。この誤差を最小限に抑えるための方法の 1 つが銀行型丸め (Banker's Rounding) です。
銀行型丸めの場合、.5 は切り上げられることもあれば、切り捨てられることもあります。慣例では、最も近い偶
数に丸められます。つまり 1.5 と 2.5 はどちらも 2 に丸められ、3.5 と 4.5 はどちらも 4 に丸められます
。銀行型丸めは対称的なアルゴリズムです。

投稿時間:2005/03/10(Thu) 10:33
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: ビット操作で納得いかないことが
\演算子を使ってください。

投稿時間:2005/03/10(Thu) 10:55
投稿者名:ダンボ
URL :
タイトル:
Re^2: ビット操作で納得いかないことが
K.J.K.さん、いつもお世話になっております。

VBヘルプより
/演算子:2つの数値の商を計算し、結果を浮動小数点数で返します。
\演算子:2つの数値の商を計算し、結果を整数で返します。小数部分はすべて切り捨てられます。

この差ですね。

投稿時間:2005/03/10(Thu) 11:01
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: ビット操作で納得いかないことが
整数(VB6のLong型)では、\とModが基本ですね。
数Mバイト程度の処理をすると、速度の差もはっきりわかりますし。
# YUV <-> RGB 変換とかDIB関連だと使う機会が多いかも。
# もっとも、最初からByteにばらしておけば済みますが...