好的,我得到了一个公式,用i和j(2D数组中的值的坐标)确定介于0.0和1.0之间的浮点值。我只是想知道这个公式究竟是做什么的。对我来说完全是无稽之谈。我已经在它自己的函数中实现了它,其中i和j的int值作为参数传递。有人可以提供解释吗?我没有理解它,因为他只是按照原样使用它,但我真的很想知道。
float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
这到底发生了什么?
答案 0 :(得分:7)
结果,如果用i,j
作为x,y坐标绘制,将是一个方块为8x8像素的棋盘。
i & 0x08
和j & 0x08
只测试每个轴的一个位。该位将每8个像素改变一次状态。
== 0
会将每个结果转换为布尔值,其值为0或1.它也会反转结果,但我不认为这与整体公式有关
^
exclusive-or运算符如果两者相同则返回0,如果它们不同则返回1。这就是你如何获得棋盘格 - 每次i
或j
越过边界时,结果都会交替出现。
答案 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
。
为什么它有用呢?这取决于i
和j
是什么。据推测,第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时,两侧的“异或”(^运算符)将为真,但不是两者都是正确的。
最后,无论出于何种原因,它都会将结果转换为浮动状态。