1

为了理解行进立方体算法,我关注了这个页面: http: //paulbourke.net/geometry/polygonise/

我有一些问题:按位 & 和 | 做什么 是什么意思?,以及他们将如何使用边缘表找到正确的三角形?

  • if (grid.val[0] < isolevel) cubeindex |= 1;

  • if (edgeTable[cubeindex] & 1) vertlist[0] = VertexInterp(isolevel,grid.p[0],grid.p[1],grid.val[0],grid.val[1]);

4

2 回答 2

1

不会读那篇文章太长了。但是在这里您可以找到位运算符的工作原理https://en.wikipedia.org/wiki/Bitwise_operations_in_C。`

cubeindex |= 1 --> cubeindex = cubeindex | 1. 

例如 cubeindex = 26 ( binary 11010) 和 1 ( binary 00001)

11010  | 00001 = 11011

在这里,您添加一个 26->27。

对于以下内容edgeTable[cubeindex] & 1

例如立方体索引 = 17 ( binary 10001) \

10001 &  00001  = 00001

这变为 1。在 if 语句中使用,这只是检查数字是否edgeTable[cubeindex]包含该位00001并相应地返回 true 或 false。

希望这可以帮助 :)

干杯

于 2017-03-06T21:19:52.633 回答
0

按位 & (and) 和 | (或)对整数值内的所有位进行操作。它独立地对每个位进行操作,并且通常与您一起使用一组布尔真值(又名标志)来指示各种对象的状态。它也可以用于(如您的示例中)或测试特定标志而不修改其他标志。

整数中的位表示两个值的幂。如果该位设置为真,则其值中包含 2 的幂。如果该位为假,则不包括在内。最低有效位 b0 代表 2^0,位 1 代表 2^1,依此类推。

例如,二进制值 5 = 101 因为 5 = 2^2 + 2^0 = 4 + 1 = 5

如果任一操作数在该位置包含 1,则按位或将结果中的位设置为 1。当且仅当两个操作数在该位置都有 1 时,按位与将每个位设置为 1。

例如:

Bitwise OR:     5 | 9 = 0101 | 1001 = 1101
Bitwise AND:    5 & 9 = 0101 & 1001 = 0001

使用这些运算符,如果 cubeindex 中的一组位值表示一组状态(真或假值),那么您可以使用相同的按位操作数来测试特定状态是否为真,而忽略其他位。

在您的示例中:

cubeindex |= 1

将 cubeindex 中的最低有效位设置为 true (1),无论它之前是什么。这是因为任何位值与 0 的按位或是相同的位值,而任何位值 1 的按位或始终为 1,因此无论其先前状态如何,都与将该位设置为 1 相同。它相当于:

立方体索引 = 立方体索引 | 000000000000000001 = b0 设置为 1 的立方体索引

逻辑与用于测试 edgeTable[cubeindex] 的最低有效位是否等于 1。仅当该值的 b0 为 1 时,条件才成立。为什么?因为其他位无关紧要,因为它们是按位与零,始终为零。

edgeTable[cubeindex] & 1 = 位 0 的值

于 2017-03-06T21:24:37.370 回答