6

OK、i と j (2D 配列の値の座標) を使用して 0.0 と 1.0 の間の float 値を決定する式が与えられました。この式が何をするのかを正確に知りたいだけです。私には意味がありません。i と j の int 値がパラメーターとして渡される独自の関数に実装しました。誰かが説明を提供できますか?彼はそのまま使うために私たちにそれをくれたので、私はそれを理解する必要はありませんが、私は本当に知りたい.

float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));

ここで何が起こっているのですか?

4

4 に答える 4

7

i,jx、y 座標としてプロットすると、結果は 8x8 ピクセルの正方形のチェッカーボードになります。

i & 0x08とはj & 0x08、各軸の 1 ビットをテストしているだけです。そのビットは、8 ピクセルごとに状態が変わります。

== 0、各結果をブール値に変換し、0 または 1 に評価されます。また、結果を反転しますが、式全体には関係ないと思います。

排他的論理^和演算子は、2 つが同じ場合は 0 を返し、異なる場合は 1 を返します。iそれがチェッカーボードを取得する方法です。結果は、境界を超えるかj交差するたびに交互になります。

于 2013-01-16T04:15:48.840 に答える
2

ここにはブール演算子とビットごとのブール演算子がたくさんあります..部分的に答えてみましょう..最初に部分に分割しましょう

A:(i & 0x08)
ビットごとに i で実行 - 基本的に、i の各ビットと 0x08 (2 進数で 1000) で実行されます。

B:A==0
EVERY BIT のビットごとの and が false かどうかをチェック 基本的には、最後から 4 ビット目が 0 かどうかをチェック

C: B ^ B'
ビット単位の XOR- 両方ではなく一方が true の場合に 1 を返します (ビット単位)

D:float(C)
簡単なもの、C をキャストして float にします。

最終結果 - わかりません..

于 2013-01-16T03:08:32.613 に答える
1
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));

& 0x08iは、ビット単位の and with 8 を実行します。これは、数値andから 4 番目の最下位ビット (1 が最下位、次に 2、4、8) を抽出することを意味しますj。は排他的 OR 演算です。両方のビットが同じ場合、^結果は 0 です。異なる場合、結果は 1 です。float= float(...)col0.0ij1.0

なぜ役に立つのでしょうか?iそれは何であるかに依存しjます。おそらく、4 番目のビットは特定の条件またはフラグ (ブール値) をエンコードします。たとえば、人が男性か女性かなどです。操作はそれ&を抽出し、^「それらは異なりますか?」と言います。ブール式を float に変換する必要があるのはなぜですか? 正直なところ、多くの正当な理由はありません-変換は、使用されている場所で常に暗黙的に実行できます(男性/女性を想定):

bool hetero = i & 0x08 ^ j & 0x08;
float estimated_children_from_coupling = 1.3 * hetero;  // same as hetero ? 1.3 : 0;
于 2013-01-16T03:08:31.623 に答える
0

つまり、「i」または「j」が 0x08 (10 進数の 8) に等しい場合、「col = 1.0」になります。

(i & 0x08): 「i == 0x08」の場合は非ゼロ、それ以外の場合はゼロ (i & 0x08) == 0: 「i != 0x08」の場合は 1/真、「i == 0x08」の場合は 0/偽「じ」

したがって、i OR j が 0x08 の場合、2 つの辺の「排他的 OR」(^ 演算子) はどちらか一方が true になりますが、両方は true ではありません。

最後に、何らかの理由で結果を float にキャストします。

于 2013-01-16T03:28:20.060 に答える