这个浮动公式是什么意思?

时间:2013-01-16 02:59:03

标签: c++ floating-point

好的,我得到了一个公式,用i和j(2D数组中的值的坐标)确定介于0.0和1.0之间的浮点值。我只是想知道这个公式究竟是做什么的。对我来说完全是无稽之谈。我已经在它自己的函数中实现了它,其中i和j的int值作为参数传递。有人可以提供解释吗?我没有理解它,因为他只是按照原样使用它,但我真的很想知道。

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

这到底发生了什么?

4 个答案:

答案 0 :(得分:7)

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

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

== 0会将每个结果转换为布尔值,其值为0或1.它也会反转结果,但我不认为这与整体公式有关

^ exclusive-or运算符如果两者相同则返回0,如果它们不同则返回1。这就是你如何获得棋盘格 - 每次ij越过边界时,结果都会交替出现。

答案 1 :(得分:2)

这里有很多布尔值和bitwise boolean operators ..让我试着回答一下...... 让我们先分成几块

A:(i & 0x08)
执行按位和on i - 基本上执行i和0x08(二进制1000)

的每一位

B:A==0
检查是否按位并且对于每个位都是假的 基本检查最后一位的第4位是否为0

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

D:float(C)
容易一个,铸造C浮动。

最终结果 - 不知道..

答案 2 :(得分:1)

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

& 0x08执行按位并使用8,这意味着它从数字i和{{1}中提取第4个最不重要的位(1是最小的,然后是2,4,8) }。 j是一个异或操作:如果两个位相同,则结果为0,如果它们不同,则结果为1.由外部^将其提升为float,所以如果= float(...)col相同,则0.0会变为i,但如果j不同,则会1.0

为什么它有用呢?这取决于ij是什么。据推测,第4位编码某些特定条件或标志(布尔值),例如:一个人是男性还是女性。 &操作会提取,然后^说“它们有区别吗?”。为什么要将布尔表达式转换为float?说实话并不是很多理由 - 你可以随时让转换在它所使用的地方隐含地进行(假设是男性/女性):

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

答案 3 :(得分:0)

简而言之,如果“i”或“j”等于0x08(十进制8),则“col = 1.0”。

(i& 0x08):如果“i == 0x08”则不为零,否则为零 (i& 0x08)== 0:1 /如果“i!= 0x08”则为真,如果“i == 0x08”则为0 / false 同样的“j”

因此,当i OR j为0x08时,两侧的“异或”(^运算符)将为真,但不是两者都是正确的。

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