好的,我被赋予了一个公式来确定0.0到1.0之间的浮点值,使用i和j(2D数组中值的坐标)。我只想确切地知道这个公式是做什么的。我已经将它实现在它自己的函数中,其中i和j的int值作为参数传递。有人能提供一个解释吗?我不必理解它,因为他给了我们这个公式只是为了直接使用,但我真的想知道。
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
这里到底发生了什么?
好的,我被赋予了一个公式来确定0.0到1.0之间的浮点值,使用i和j(2D数组中值的坐标)。我只想确切地知道这个公式是做什么的。我已经将它实现在它自己的函数中,其中i和j的int值作为参数传递。有人能提供一个解释吗?我不必理解它,因为他给了我们这个公式只是为了直接使用,但我真的想知道。
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
这里到底发生了什么?
== 0
将每个结果转换为布尔值,它将评估为0或1。它还反转了结果,但我认为这并不影响整个公式。^
将在两者相同时返回0,在不同时返回1。这就是你得到棋盘图案的方式 - 每当或跨越边界时,结果会交替变化。float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
& 0x08
对8进行按位与运算,这意味着它从数字i和j中提取第4个最不重要的位(1是最不重要的,然后是2、4、8)。符号^
是一种异或操作:如果两个位相同,则结果为0,如果它们不同,则结果为1。外部的= float(...)
将其提升为float
,因此如果i和j相同,则col
变为0.0
,但如果它们不同,则变为1.0
。
这有什么用处呢?这取决于i
和j
是什么。可能第四位编码了某些特定的条件或标志(布尔值),例如:一个人是男性还是女性。 &
操作提取它,然后^
表示“它们是否不同?”为什么要将布尔表达式转换为浮点数?说实话没有太多好的理由 - 您可以始终让转换在使用它的地方隐式完成(假设是男/女):
bool hetero = i & 0x08 ^ j & 0x08;
float estimated_children_from_coupling = 1.3 * hetero; // same as hetero ? 1.3 : 0;
(float)blah
)。 - Oliver Charlesworth
&
是按位与运算符。0x08
是一个十六进制值,只是数字8
。 - Mysticial((i^j)&8)/8.0
,或许同样神秘。 - rici