这个浮点数公式是什么意思?

6

好的,我被赋予了一个公式来确定0.0到1.0之间的浮点值,使用i和j(2D数组中值的坐标)。我只想确切地知道这个公式是做什么的。我已经将它实现在它自己的函数中,其中i和j的int值作为参数传递。有人能提供一个解释吗?我不必理解它,因为他给了我们这个公式只是为了直接使用,但我真的想知道。

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

这里到底发生了什么?


2
通常情况下,您可以通过将复杂表达式分解为其组成部分来理解它。您不理解哪个部分? - Oliver Charlesworth
这个实际上一点也不明显。我自己两分钟都想不出来,所以我会点赞它。 - Mysticial
1
在这种情况下,按位与运算符0x08是一个十六进制值,只是数字8 - Mysticial
1
这不是一个函数,而是显式类型转换。 - lapk
6
如果你实现它,你可能会看到意图是绘制一个棋盘(假设宽和高都是64)。实际上,这个表达式也可以写成 ((i^j)&8)/8.0,或许同样神秘。 - rici
显示剩余12条评论
4个回答

7
如果用作为x,y坐标绘制结果,将得到一个8x8像素正方形交错的棋盘图案。 和仅测试每个轴的单个位。该位将在每8个像素时更改状态。 == 0将每个结果转换为布尔值,它将评估为0或1。它还反转了结果,但我认为这并不影响整个公式。
异或运算符^将在两者相同时返回0,在不同时返回1。这就是你得到棋盘图案的方式 - 每当或跨越边界时,结果会交替变化。

1
@mvp 不,而且看起来我也无法阅读。回顾一下原问题的评论,似乎在我之前有43分钟有人得出了同样的结论。 - Mark Ransom
我看到了 - 这是由@rici提供的。不过,你还是花时间在这里打出了这个很棒的答案。 - mvp
@mvp,感谢夸奖。我一直努力留下好的答案,但有些尝试比其他尝试更成功。多练习有所帮助,我已经从事这个工作5年了。你可能会发现这很有趣:http://www.codinghorror.com/blog/2011/02/how-to-write-without-writing.html - Mark Ransom

2
这里有很多布尔运算和按位布尔运算符。让我分段回答。首先将其拆分为几个部分。
A:(i & 0x08) 在 i 上执行按位与操作-基本上是对 i 的每个位和 0x08(二进制中的 1000)执行 and 操作
B:A==0 检查按位与是否对 每个位 都为false 基本上检查从最后一个数起的第4个位是否为0
C:B ^ B' 按位异或-如果其中一个是 true,而不是两个都是 true,则返回 1(按位)
D:float(C) 简单的,将 C 转换为 float 型。
最终结果-没有头绪...

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

这有什么用处呢?这取决于ij是什么。可能第四位编码了某些特定的条件或标志(布尔值),例如:一个人是男性还是女性。 &操作提取它,然后^表示“它们是否不同?”为什么要将布尔表达式转换为浮点数?说实话没有太多好的理由 - 您可以始终让转换在使用它的地方隐式完成(假设是男/女):

bool hetero = i & 0x08 ^ j & 0x08;
float estimated_children_from_coupling = 1.3 * hetero;  // same as hetero ? 1.3 : 0;

1
注意:这不是 C 风格的强制类型转换(那将是 (float)blah)。 - Oliver Charlesworth
@OliCharlesworth:啊,没错……C语言有点生疏了。谢谢。 - Tony Delroy

0
简而言之,如果“i”或“j”等于0x08(十进制8),则“col = 1.0”。
(i&0x08):如果“i == 0x08”,则不为零,否则为零 (i&0x08)== 0:如果“i!= 0x08”,则为1 / true,如果“i == 0x08”,则为0 / false “j”也是如此
因此,两侧的“异或”(^运算符)将在其中一个为true时为true,但不是两者都为true,这发生在i OR j为0x08时。
最后,它将结果转换为浮点数,原因不明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接