C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: &H0 OrElse &HFFの判定


(過去ログ 97 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■58145 / inTopicNo.1)  &H0 OrElse &HFFの判定
  
□投稿者/ レーモン (12回)-(2011/03/27(Sun) 10:41:05)

分類:[VB.NET/VB2005 以降] 

VB2008 Expressを使用しています。
以下のバイト型変数があるとします。

Dim bytR as Byte
Dim bytG as Byte
Dim bytB as Byte
(お気づきの方もいらっしゃると思いますが、これはRGBカラーのバイトです)

ここで、bytR, bytG, bytBがすべて&H0またはすべて&HFFであるかどうかを判定したく、

If (bytR = &H0 AndAlso bytG = &H0 AndAlso bytB = &H0) OrElse (bytR = &HFF AndAlso bytG = &HFF AndAlso bytB = &HFF) Then

というIf文を作成しましたが、この演算をループで行いたいので、これよりもっと処理の速い演算式があればお教えください。
おそらくビット演算の方が処理が早いのではないかと思うのですが、あまり詳しくないのでよろしくお願い致します。
引用返信 編集キー/
■58147 / inTopicNo.2)  Re[1]: &H0 OrElse &HFFの判定
□投稿者/ 渋木宏明 (68回)-(2011/03/27(Sun) 15:31:53)
渋木宏明 さんの Web サイト
R, G, B 3値の論理和が 0 なら全部ゼロ。

また、R, G, B 3値の論理積が ff なら全部 ff なんじゃないでしょーか。
引用返信 編集キー/
■58148 / inTopicNo.3)  Re[2]: &H0 OrElse &HFFの判定
□投稿者/ やじゅ (1872回)-(2011/03/27(Sun) 19:05:23)
やじゅ さんの Web サイト
2011/03/28(Mon) 01:42:20 編集(投稿者)
案1 渋木さんの方法
If ((bytR Or bytG Or bytB) = &H0) OrElse ((bytR And bytG And bytB) = &HFF) Then
    Console.WriteLine("OK")
End If

案2 値+1と最大値の論理積の方法 全てFF=0、全て00=1
Dim byteArray() = {bytR, bytG, bytB,  CType(0, Byte)}
If CUInt((BitConverter.ToUInt32(byteArray, 0) + 1 And &HFFFFFF)) < 2 Then
    Console.WriteLine("OK")
End If

案3 余剰(Mod)を利用した方法
Dim byteArray() = {bytR, bytG, bytB, CType(0, Byte)}
If BitConverter.ToInt32(byteArray, 0) Mod &HFFFFFF = 0 Then
    Console.WriteLine("OK")
End If

※BitConverterやModを使用した時点で遅いので、単純な演算の方が早いです。

引用返信 編集キー/
■58149 / inTopicNo.4)  Re[3]: &H0 OrElse &HFFの判定
□投稿者/ Hongliang (765回)-(2011/03/27(Sun) 20:40:14)
三つの和が0か765かでいいんじゃないかなぁ
引用返信 編集キー/
■58150 / inTopicNo.5)  Re[4]: &H0 OrElse &HFFの判定
□投稿者/ shu (561回)-(2011/03/27(Sun) 21:21:45)
やり方に関する回答はいろいろ出ているので、
これが前スレに関係する内容として、最初に &H0か&HFFで判定してしまえば
後はそれと同じ判定にしないといけないんじゃないかな?そうしないと&H0と&HFFのまだらが
余白として扱われてしまいます。
引用返信 編集キー/
■58155 / inTopicNo.6)  Re[5]: &H0 OrElse &HFFの判定
□投稿者/ レーモン (13回)-(2011/03/28(Mon) 10:56:35)
みなさま、コメントありがとうございます。
実際に実験を行ってみますが、とりあえずなるべくシンプルな演算でやってみようと思います。

なお、この件は、以下で質問しました、ビットマップの余白の件とは全く別です。>shu様
http://bbs.wankuma.com/index.cgi?mode=al2&namber=58070
引用返信 編集キー/
■58163 / inTopicNo.7)  Re[6]: &H0 OrElse &HFFの判定
□投稿者/ レーモン (14回)-(2011/03/28(Mon) 12:51:47)
結論として、ループをぐるぐる回して処理時間を計測したら、結局、最初に出した例

If (bytR = &H0 AndAlso bytG = &H0 AndAlso bytB = &H0) OrElse (bytR = &HFF AndAlso bytG = &HFF AndAlso bytB = &HFF) Then

の方が、

If ((bytR Or bytG Or bytB) = &H0) OrElse ((bytR And bytG And bytB) = &HFF) Then

よりも若干早かったでした。
(他の方法は試してみません。)
おそらく、後者は必ず(bytR Or bytG Or bytB)の演算を行う必要があるからでしょうか。

とりあえず、これは解決とします。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -