Как эта битовая операция проверяет на питание 2?

jQuery будет моей лучшей рекомендацией. Не только для самого кода, но и идиома, стиль, мышление, стоящее за ним, наиболее достойны эмуляции.

39
задан Coocoo4Cocoa 27 June 2009 в 20:44
поделиться

4 ответа

Любая степень 2 минус 1 - это все единицы: ( 2 N - 1 = 111 .... b )

2 = 2^1.  2-1 = 1 (1b)
4 = 2^2.  4-1 = 3 (11b)
8 = 2^3.  8-1 = 7 (111b)

Возьмите 8 например. 1000 & 0111 = 0000

Таким образом, это выражение проверяет, НЕ является ли число степенью 2.

92
ответ дан 27 November 2019 в 02:09
поделиться

Итак, в первом случае будет проверяться 2 0 == 1.

В других случаях num & (num - 1) вступает в игру:

Это означает, что если вы возьмете любое число и замаскируете биты из одного меньшего, вы получите один из двух случаев:

  1. если число уже является степенью двойки, то на один меньше приведет к двоичному числу, в котором установлены только младшие биты. Использование & ничего не сделает.

    • Пример с 8: 0100 & (0100 - 1) -> (0100 & 0011) -> 0000
  2. если число уже не является степенью двойки, то на единицу меньше не будет касаться самого старшего бита, поэтому результатом будет по крайней мере наибольшая степень двойки меньше числа.

    • Пример с 3: 0011 & (0011 - 1) ->

14
ответ дан 27 November 2019 в 02:09
поделиться

Хорошо,

если у вас X = 1000, то x-1 = 0111. И 1000 && 0111 равно 0000.

Каждое число X, которое является степенью 2, имеет x-1, который имеет единицы на позиции x имеет нули. И побитовое and 0 и 1 всегда равно 0.

Если число x не является степенью двойки, например 0110. x-1 равно 0101, а и дает 0100.

Для всех комбинаций в пределах 0000 - 1111 это приводит к

   X  X-1 X && X-1  
0000 1111 0000   
0001 0000 0000 
0010 0001 0000
0011 0010 0010
0100 0011 0000
0101 0100 0100
0110 0101 0100
0111 0110 0110
1000 0111 0000
1001 1000 1000
1010 1001 1000
1011 1010 1010
1100 1011 1000
1101 1100 1100
1110 1101 1100
1111 1110 1110

И нет необходимости в отдельной проверке для 1.

6
ответ дан 27 November 2019 в 02:09
поделиться

Разъяснено здесь красиво

Также в данном выражении 0 рассматривается как степень 2. Чтобы исправить это, используйте ! (X & (x - 1)) && x; вместо.

3
ответ дан 27 November 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: