6

好的,我得到了一个公式,可以使用 i 和 j(二维数组中值的坐标)确定 0.0 到 1.0 之间的浮点值。我只是想确切地知道这个公式的作用。对我来说完全是无稽之谈。我已经在它自己的函数中实现了它,其中 i 和 j 的 int 值作为参数传递。有人可以提供解释吗?我不必理解它,因为他把它交给我们只是为了按原样使用,但我真的很想知道。

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

这里到底发生了什么?

4

4 回答 4

7

结果,如果绘制i,j为 x,y 坐标,将是一个具有 8x8 像素正方形的棋盘。

i & 0x08j & 0x08只是测试每个轴的一个位。该位将每 8 个像素更改一次状态。

== 0会将每个结果转换为布尔值,其计算结果为 0 或 1。它还会反转结果,但我认为这与整个公式无关。

如果两者^相同,异或运算符将返回 0,如果它们不同,则返回 1。这就是您获得棋盘的方式 - 结果每次交替出现ij越过边界。

于 2013-01-16T04:15:48.840 回答
2

这里有很多布尔和按位布尔运算符..让我尝试分部分回答..让我们先分成几部分

A:(i & 0x08)
在 i 上执行按位和 - 基本上是在 i 和 0x08 的每个位上执行(二进制为 1000)

B:A==0
检查每个位的按位和是否为假 基本上检查最后的第 4 位是否为 0

C: B ^ B'
按位异或 - 如果其中一个为真,而不是两个都为真,则返回 1(按位)

D:float(C)
简单的一个,将 C 抛到浮动。

最终结果 - 不知道..

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

& 0x08i用 8 进行按位运算,这意味着它从数字和中提取第 4 个最低有效位(1 是最低的,然后是 2、4、8)j。是^异或运算:如果两个位相同,则结果为 0,如果它们不同,则结果为 1。float外部将其提升为 a = float(...),因此col变为0.0ifijare 相同,但1.0如果它们不同。

为什么它可能有用?这取决于什么ij是什么。据推测,第 4 位编码一些特定的条件或标志(布尔值),例如:一个人是男性还是女性。&操作提取,然后说^“他们不同吗?”。为什么要将布尔表达式转换为浮点数?老实说,没有太多充分的理由 - 你总是可以让转换在它使用的地方隐式完成(假设男性/女性):

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(十进制 8),则“col = 1.0”。

(i & 0x08):如果 "i == 0x08" 则不为零,否则为零 (i & 0x08) == 0:如果 "i != 0x08" 则为 1/true,如果 "i == 0x08" 则为 0/false “j”

因此,两侧的“异或”(^ 运算符)将是正确的,其中任何一个都是正确的,但不是两者都是正确的,当 i OR j 为 0x08 时会发生这种情况。

最后,无论出于何种原因,它都会将结果转换为浮动。

于 2013-01-16T03:28:20.060 回答