好的,我得到了一个公式,可以使用 i 和 j(二维数组中值的坐标)确定 0.0 到 1.0 之间的浮点值。我只是想确切地知道这个公式的作用。对我来说完全是无稽之谈。我已经在它自己的函数中实现了它,其中 i 和 j 的 int 值作为参数传递。有人可以提供解释吗?我不必理解它,因为他把它交给我们只是为了按原样使用,但我真的很想知道。
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
这里到底发生了什么?
好的,我得到了一个公式,可以使用 i 和 j(二维数组中值的坐标)确定 0.0 到 1.0 之间的浮点值。我只是想确切地知道这个公式的作用。对我来说完全是无稽之谈。我已经在它自己的函数中实现了它,其中 i 和 j 的 int 值作为参数传递。有人可以提供解释吗?我不必理解它,因为他把它交给我们只是为了按原样使用,但我真的很想知道。
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
这里到底发生了什么?
结果,如果绘制i,j
为 x,y 坐标,将是一个具有 8x8 像素正方形的棋盘。
i & 0x08
和j & 0x08
只是测试每个轴的一个位。该位将每 8 个像素更改一次状态。
== 0
会将每个结果转换为布尔值,其计算结果为 0 或 1。它还会反转结果,但我认为这与整个公式无关。
如果两者^
相同,异或运算符将返回 0,如果它们不同,则返回 1。这就是您获得棋盘的方式 - 结果每次交替出现i
或j
越过边界。
这里有很多布尔和按位布尔运算符..让我尝试分部分回答..让我们先分成几部分
A:(i & 0x08)
在 i 上执行按位和 - 基本上是在 i 和 0x08 的每个位上执行(二进制为 1000)
B:A==0
检查每个位的按位和是否为假
基本上检查最后的第 4 位是否为 0
C: B ^ B'
按位异或 - 如果其中一个为真,而不是两个都为真,则返回 1(按位)
D:float(C)
简单的一个,将 C 抛到浮动。
最终结果 - 不知道..
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
& 0x08
i
用 8 进行按位运算,这意味着它从数字和中提取第 4 个最低有效位(1 是最低的,然后是 2、4、8)j
。是^
异或运算:如果两个位相同,则结果为 0,如果它们不同,则结果为 1。float
外部将其提升为 a = float(...)
,因此col
变为0.0
ifi
和j
are 相同,但1.0
如果它们不同。
为什么它可能有用?这取决于什么i
和j
是什么。据推测,第 4 位编码一些特定的条件或标志(布尔值),例如:一个人是男性还是女性。&
操作提取,然后说^
“他们不同吗?”。为什么要将布尔表达式转换为浮点数?老实说,没有太多充分的理由 - 你总是可以让转换在它使用的地方隐式完成(假设男性/女性):
bool hetero = i & 0x08 ^ j & 0x08;
float estimated_children_from_coupling = 1.3 * hetero; // same as hetero ? 1.3 : 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 时会发生这种情况。
最后,无论出于何种原因,它都会将结果转换为浮动。