1

爲了瞭解行軍立方體算法,我跟着這個頁面: http://paulbourke.net/geometry/polygonise/移動立方體,按位and和or

我有一些問題: 什麼做按位&和|是什麼意思?以及他們如何使用邊緣表來尋找正確的T字形?

  • 如果(grid.val [0] < ISOLEVEL)cubeindex | = 1;

  • 如果(edgeTable [cubeindex] & 1) vertlist [0] = VertexInterp(ISOLEVEL,grid.p [0],grid.p [1],grid.val [0],grid.val [ 1]);

回答

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

例如cubeindex = 17(binary 10001)\

10001 & 00001 = 00001 

這變得1.用於在if語句,這只是檢查,如果數edgeTable[cubeindex]包含位00001並相應地返回true或false。

希望這有助於:)

乾杯

0

按位&(和)和| (或)對整數值內的所有位進行操作。它對每個位都獨立運行,並且經常與您一起使用,它有一組指示各種對象狀態的布爾真值(又名標誌)。它也可以用於(如你的例子)或測試一個特定的標誌,而不修改其他的。

整數中的位表示兩個值的冪。如果該位設置爲true,則其值爲2的冪。如果該位錯誤,則不包括在內。最低有效位b0代表2^0,位1代表2^1,依此類推。

例如,在值5 = 101二進制因爲5 = 2^2 + 2^0 = 4 + 1 = 5

按位或通過如果任一在結果中的兩位設置爲1作品操作數在該位置包含一個操作數。當且僅當兩個操作數在該位置具有1時,纔將每個位設置爲1,從而進行位運算。

例如:

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

使用這些運營商,如果集cubeindex位值的代表一組狀態(true或false值),那麼你可以使用相同的按位操作數,如果測試和一個特定的狀態是正確的,而忽略其他位。

在您的例子:

cubeindex |= 1 

設置至少顯著位cubeindex爲真(1)不管它是什麼了。這是因爲任何位值爲0的位OR是相同的位值,而任何位值1的位OR總是1,因此與將該位設置爲1無關,而不管其先前的sta如何。它相當於:

cubeindex = cubeindex | 000000000000000001 = cube0,b0設置爲1

邏輯AND用於測試edgeTable [cubeindex]的最低有效位是否等於1.條件只有當該值的b0爲1時才爲真。爲什麼?因爲其他位並不重要,因爲它們與零進行按位與,總是零。

edgeTable [cubeindex] & 1 =位0的值