这个浮动公式是什么意思

What does this float formula mean?

本文关键字:是什么 意思      更新时间:2023-10-16

好的,我得到了一个公式,使用I和j (2D数组中值的坐标)确定0.0和1.0之间的浮点值。我只是想知道这个公式到底是做什么的。这对我来说毫无意义。我已经在它自己的函数中实现了它,其中I和j的int值作为参数传递。有人能解释一下吗?我不必理解它,因为他给我们的只是原样使用,但我真的很想知道。

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

这到底是怎么回事?

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

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

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

^的异或运算符将返回0,如果两者相同,则返回1。这就是你得到棋盘的方式——每次ij越过边界时,结果都会发生变化。

这里有很多布尔运算符和位布尔运算符。让我试着部分地回答。让我们先分成几部分

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

B:A==0
检查每一位是否按位和为假基本上检查倒数第4位是否为0

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

D:float(C)
简单一种,把C投到浮上。

最终结果- No idea.

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

& 0x08按位和带8,这意味着它从数字ij中提取第四个最低有效位(1是最低的,然后是2,4,8)。^是一个异或操作:如果两位相同,结果为0,如果不相同,结果为1。它被外部的= float(...)提升为float,因此如果ij相同,则col变为0.0,如果它们不同,则变为1.0

为什么它可能有用?这取决于ij是什么。据推测,第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"

(我和0x08):如果"i == 0x08"不为零,否则为零(我,0x08) == 0: 1/true if "i != 0x08", 0/false if "i == 0x08"j"

也一样

因此,两边的"异或"(^运算符)将为真,其中一方为真,但不同时为真,这种情况发生在i或j为0x08时。

最后,不管什么原因,它将结果强制转换为float