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