2017-10-13 3 views
5

シームレスなテクスチャを作成するためにラップアラウンドするC#のダイヤモンドスクエアアルゴリズムのimplementationについて読んでいます。次の点を計算するために、正方形または菱形に配置された4つのサンプル点の平均が取られる。テクスチャのエッジにサンプルポイントがある場合、サンプルポイントは反対側にラップされます。このラッピングは、以下のメソッドを使用して行われます。この文のビット単位の&の機能は何ですか?

public double sample(int x, int y) 
{ 
    return values[(x & (width - 1)) + (y & (height - 1)) * width]; 
} 

これはビット演算子です。私は以前にそれらを使用していないし、wikipedia articleは啓発されていませんでした。誰かが&オペレータがこの方法で何をしているのか説明できますか?

EDIT:テクスチャ寸法は、それは「ラッピング」のためだ常に2

答えて

8

の力です。 は、負の値であるx(ただし、は負の値を持ちますが、負の値を持つことになります)を除いて、ほとんどがx % widthに相当します。ただし、負の値を持つ結果)、ほぼ確実に高速です。

または実施例で視覚的にそれを置くためには、あなたがw-1のフォームからもわかるように、その後

x  = 00000000 00000000 00000000 01001100 
w  = 00000000 00000000 00000000 01000000 
w-1  = 00000000 00000000 00000000 00111111 
x & w-1 = 00000000 00000000 00000000 00001100 = 12 

width = 64x = 64+12 = 76言って、操作x & w-1は想定し、xの底部のみのビットを取るようなものですもちろんwはまだ2の威力です。したがって、真の "モジュロ64"演算(これは符号付き整数で作業している場合はC#では%ではありません)と同じように、ウェイトが64で倍数が64のビットが削除されます。

関連する問題