Марширующий куб, побитовое и и ИЛИ

Чтобы понять алгоритм марширующего куба, я следил за этой страницей: 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]);


person Tina    schedule 06.03.2017    source источник


Ответы (2)



Побитовое & (и) и | (или) работать со всеми битами в пределах целочисленного значения. Он работает с каждым битом независимо и часто используется с набором логических значений истинности (также известных как флаги), которые указывают состояние различных объектов. Его также можно использовать (как в вашем примере) или проверить определенный флаг, не изменяя другие.

Биты целого числа представляют степени двух значений. Если для этого бита установлено значение true, то эта степень двойки включается в его значение. Если этот бит ложен, то он не включается. Младший значащий бит 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 представляет собой набор состояний (истинные или ложные значения), вы можете использовать те же побитовые операнды для проверки истинности определенного состояния, игнорируя при этом другие биты.

В вашем примере:

cubeindex |= 1

устанавливает младший значащий бит в cubeindex равным true (1) независимо от того, что было раньше. Это связано с тем, что побитовое ИЛИ любого битового значения, равного 0, является одним и тем же битовым значением, в то время как побитовое ИЛИ любого битового значения, равного 1, всегда равно 1, и поэтому это то же самое, что установка этого бита в 1 независимо от его предыдущего состояния. Это эквивалентно:

кубиндекс = кубиндекс | 000000000000000001 = cubeindex со значением b0 равным 1

Логическое И используется для проверки того, равен ли младший значащий бит edgeTable[cubeindex] 1. Условие выполняется только в том случае, если b0 этого значения равно 1. Почему? Потому что другие биты не имеют значения, поскольку они побитовые И с нулем, который всегда равен нулю.

edgeTable[cubeindex] & 1 = значение бита 0

person ScottK    schedule 06.03.2017