2014-02-01 3 views
4

Меня спросили об этом, и я печатаю таблицы, пытаясь найти узоры, но до сих пор не вижу смысла.n & ~ (n - 1) Что делает эта функция?

uint16_t hmmm(uint16_t n) { 
    return (n & ~(n - 1)); 
} 

Часть цифрового фильтра? Анимированная анимация с двойной спиралью?

Я действительно интересно ли спрашивающих означает лицо п & (п - 1): n & (n-1) what does this expression do?

Вот некоторые выход из маленького теста я написал:

in: 0, 0b00000000 out: 0, 0b00000000 
in: 1, 0b00000001 out: 1, 0b00000001 
in: 2, 0b00000010 out: 2, 0b00000010 
in: 3, 0b00000011 out: 1, 0b00000001 
in: 4, 0b00000100 out: 4, 0b00000100 
in: 5, 0b00000101 out: 1, 0b00000001 
in: 6, 0b00000110 out: 2, 0b00000010 
in: 7, 0b00000111 out: 1, 0b00000001 
in: 8, 0b00001000 out: 8, 0b00001000 
in: 9, 0b00001001 out: 1, 0b00000001 
in: 10, 0b00001010 out: 2, 0b00000010 
in: 11, 0b00001011 out: 1, 0b00000001 
in: 12, 0b00001100 out: 4, 0b00000100 
in: 13, 0b00001101 out: 1, 0b00000001 
in: 14, 0b00001110 out: 2, 0b00000010 
in: 15, 0b00001111 out: 1, 0b00000001 
in: 16, 0b00010000 out: 16, 0b00010000 
in: 17, 0b00010001 out: 1, 0b00000001 
in: 18, 0b00010010 out: 2, 0b00000010 
in: 19, 0b00010011 out: 1, 0b00000001 
in: 20, 0b00010100 out: 4, 0b00000100 
in: 21, 0b00010101 out: 1, 0b00000001 
in: 22, 0b00010110 out: 2, 0b00000010 
in: 23, 0b00010111 out: 1, 0b00000001 
in: 24, 0b00011000 out: 8, 0b00001000 
in: 25, 0b00011001 out: 1, 0b00000001 
in: 26, 0b00011010 out: 2, 0b00000010 
in: 27, 0b00011011 out: 1, 0b00000001 
in: 28, 0b00011100 out: 4, 0b00000100 
in: 29, 0b00011101 out: 1, 0b00000001 
in: 30, 0b00011110 out: 2, 0b00000010 
in: 31, 0b00011111 out: 1, 0b00000001 
in: 32, 0b00100000 out: 32, 0b00100000 
in: 33, 0b00100001 out: 1, 0b00000001 
in: 34, 0b00100010 out: 2, 0b00000010 
in: 35, 0b00100011 out: 1, 0b00000001 
in: 36, 0b00100100 out: 4, 0b00000100 
in: 37, 0b00100101 out: 1, 0b00000001 
in: 38, 0b00100110 out: 2, 0b00000010 
in: 39, 0b00100111 out: 1, 0b00000001 
in: 40, 0b00101000 out: 8, 0b00001000 
in: 41, 0b00101001 out: 1, 0b00000001 
in: 42, 0b00101010 out: 2, 0b00000010 
in: 43, 0b00101011 out: 1, 0b00000001 
in: 44, 0b00101100 out: 4, 0b00000100 
in: 45, 0b00101101 out: 1, 0b00000001 
in: 46, 0b00101110 out: 2, 0b00000010 
in: 47, 0b00101111 out: 1, 0b00000001 
in: 48, 0b00110000 out: 16, 0b00010000 
in: 49, 0b00110001 out: 1, 0b00000001 
in: 50, 0b00110010 out: 2, 0b00000010 
in: 51, 0b00110011 out: 1, 0b00000001 
in: 52, 0b00110100 out: 4, 0b00000100 
in: 53, 0b00110101 out: 1, 0b00000001 
in: 54, 0b00110110 out: 2, 0b00000010 
in: 55, 0b00110111 out: 1, 0b00000001 
in: 56, 0b00111000 out: 8, 0b00001000 
in: 57, 0b00111001 out: 1, 0b00000001 
in: 58, 0b00111010 out: 2, 0b00000010 
in: 59, 0b00111011 out: 1, 0b00000001 
in: 60, 0b00111100 out: 4, 0b00000100 
in: 61, 0b00111101 out: 1, 0b00000001 
in: 62, 0b00111110 out: 2, 0b00000010 
in: 63, 0b00111111 out: 1, 0b00000001 
in: 64, 0b01000000 out: 64, 0b01000000 
in: 65, 0b01000001 out: 1, 0b00000001 
in: 66, 0b01000010 out: 2, 0b00000010 
in: 67, 0b01000011 out: 1, 0b00000001 
in: 68, 0b01000100 out: 4, 0b00000100 
in: 69, 0b01000101 out: 1, 0b00000001 
in: 70, 0b01000110 out: 2, 0b00000010 
in: 71, 0b01000111 out: 1, 0b00000001 
in: 72, 0b01001000 out: 8, 0b00001000 
in: 73, 0b01001001 out: 1, 0b00000001 
in: 74, 0b01001010 out: 2, 0b00000010 
in: 75, 0b01001011 out: 1, 0b00000001 
in: 76, 0b01001100 out: 4, 0b00000100 
in: 77, 0b01001101 out: 1, 0b00000001 
in: 78, 0b01001110 out: 2, 0b00000010 
in: 79, 0b01001111 out: 1, 0b00000001 
in: 80, 0b01010000 out: 16, 0b00010000 
in: 81, 0b01010001 out: 1, 0b00000001 
in: 82, 0b01010010 out: 2, 0b00000010 
in: 83, 0b01010011 out: 1, 0b00000001 
in: 84, 0b01010100 out: 4, 0b00000100 
in: 85, 0b01010101 out: 1, 0b00000001 
in: 86, 0b01010110 out: 2, 0b00000010 
in: 87, 0b01010111 out: 1, 0b00000001 
in: 88, 0b01011000 out: 8, 0b00001000 
in: 89, 0b01011001 out: 1, 0b00000001 
in: 90, 0b01011010 out: 2, 0b00000010 
in: 91, 0b01011011 out: 1, 0b00000001 
in: 92, 0b01011100 out: 4, 0b00000100 
in: 93, 0b01011101 out: 1, 0b00000001 
in: 94, 0b01011110 out: 2, 0b00000010 
in: 95, 0b01011111 out: 1, 0b00000001 
in: 96, 0b01100000 out: 32, 0b00100000 
in: 97, 0b01100001 out: 1, 0b00000001 
in: 98, 0b01100010 out: 2, 0b00000010 
in: 99, 0b01100011 out: 1, 0b00000001 
in: 100, 0b01100100 out: 4, 0b00000100 
in: 101, 0b01100101 out: 1, 0b00000001 
in: 102, 0b01100110 out: 2, 0b00000010 
in: 103, 0b01100111 out: 1, 0b00000001 
in: 104, 0b01101000 out: 8, 0b00001000 
in: 105, 0b01101001 out: 1, 0b00000001 
in: 106, 0b01101010 out: 2, 0b00000010 
in: 107, 0b01101011 out: 1, 0b00000001 
in: 108, 0b01101100 out: 4, 0b00000100 
in: 109, 0b01101101 out: 1, 0b00000001 
in: 110, 0b01101110 out: 2, 0b00000010 
in: 111, 0b01101111 out: 1, 0b00000001 
in: 112, 0b01110000 out: 16, 0b00010000 
in: 113, 0b01110001 out: 1, 0b00000001 
in: 114, 0b01110010 out: 2, 0b00000010 
in: 115, 0b01110011 out: 1, 0b00000001 
in: 116, 0b01110100 out: 4, 0b00000100 
in: 117, 0b01110101 out: 1, 0b00000001 
in: 118, 0b01110110 out: 2, 0b00000010 
in: 119, 0b01110111 out: 1, 0b00000001 
in: 120, 0b01111000 out: 8, 0b00001000 
in: 121, 0b01111001 out: 1, 0b00000001 
in: 122, 0b01111010 out: 2, 0b00000010 
in: 123, 0b01111011 out: 1, 0b00000001 
in: 124, 0b01111100 out: 4, 0b00000100 
in: 125, 0b01111101 out: 1, 0b00000001 
in: 126, 0b01111110 out: 2, 0b00000010 
in: 127, 0b01111111 out: 1, 0b00000001 
in: 128, 0b10000000 out: 128, 0b10000000 
in: 129, 0b10000001 out: 1, 0b00000001 
in: 130, 0b10000010 out: 2, 0b00000010 
in: 131, 0b10000011 out: 1, 0b00000001 
in: 132, 0b10000100 out: 4, 0b00000100 
in: 133, 0b10000101 out: 1, 0b00000001 
in: 134, 0b10000110 out: 2, 0b00000010 
in: 135, 0b10000111 out: 1, 0b00000001 
in: 136, 0b10001000 out: 8, 0b00001000 
in: 137, 0b10001001 out: 1, 0b00000001 
in: 138, 0b10001010 out: 2, 0b00000010 
in: 139, 0b10001011 out: 1, 0b00000001 
in: 140, 0b10001100 out: 4, 0b00000100 
in: 141, 0b10001101 out: 1, 0b00000001 
in: 142, 0b10001110 out: 2, 0b00000010 
in: 143, 0b10001111 out: 1, 0b00000001 
in: 144, 0b10010000 out: 16, 0b00010000 
in: 145, 0b10010001 out: 1, 0b00000001 
in: 146, 0b10010010 out: 2, 0b00000010 
in: 147, 0b10010011 out: 1, 0b00000001 
in: 148, 0b10010100 out: 4, 0b00000100 
in: 149, 0b10010101 out: 1, 0b00000001 
in: 150, 0b10010110 out: 2, 0b00000010 
in: 151, 0b10010111 out: 1, 0b00000001 
in: 152, 0b10011000 out: 8, 0b00001000 
in: 153, 0b10011001 out: 1, 0b00000001 
in: 154, 0b10011010 out: 2, 0b00000010 
in: 155, 0b10011011 out: 1, 0b00000001 
in: 156, 0b10011100 out: 4, 0b00000100 
in: 157, 0b10011101 out: 1, 0b00000001 
in: 158, 0b10011110 out: 2, 0b00000010 
in: 159, 0b10011111 out: 1, 0b00000001 
in: 160, 0b10100000 out: 32, 0b00100000 
in: 161, 0b10100001 out: 1, 0b00000001 
in: 162, 0b10100010 out: 2, 0b00000010 
in: 163, 0b10100011 out: 1, 0b00000001 
in: 164, 0b10100100 out: 4, 0b00000100 
in: 165, 0b10100101 out: 1, 0b00000001 
in: 166, 0b10100110 out: 2, 0b00000010 
in: 167, 0b10100111 out: 1, 0b00000001 
in: 168, 0b10101000 out: 8, 0b00001000 
in: 169, 0b10101001 out: 1, 0b00000001 
in: 170, 0b10101010 out: 2, 0b00000010 
in: 171, 0b10101011 out: 1, 0b00000001 
in: 172, 0b10101100 out: 4, 0b00000100 
in: 173, 0b10101101 out: 1, 0b00000001 
in: 174, 0b10101110 out: 2, 0b00000010 
in: 175, 0b10101111 out: 1, 0b00000001 
in: 176, 0b10110000 out: 16, 0b00010000 
in: 177, 0b10110001 out: 1, 0b00000001 
in: 178, 0b10110010 out: 2, 0b00000010 
in: 179, 0b10110011 out: 1, 0b00000001 
in: 180, 0b10110100 out: 4, 0b00000100 
in: 181, 0b10110101 out: 1, 0b00000001 
in: 182, 0b10110110 out: 2, 0b00000010 
in: 183, 0b10110111 out: 1, 0b00000001 
in: 184, 0b10111000 out: 8, 0b00001000 
in: 185, 0b10111001 out: 1, 0b00000001 
in: 186, 0b10111010 out: 2, 0b00000010 
in: 187, 0b10111011 out: 1, 0b00000001 
in: 188, 0b10111100 out: 4, 0b00000100 
in: 189, 0b10111101 out: 1, 0b00000001 
in: 190, 0b10111110 out: 2, 0b00000010 
in: 191, 0b10111111 out: 1, 0b00000001 
in: 192, 0b11000000 out: 64, 0b01000000 
in: 193, 0b11000001 out: 1, 0b00000001 
in: 194, 0b11000010 out: 2, 0b00000010 
in: 195, 0b11000011 out: 1, 0b00000001 
in: 196, 0b11000100 out: 4, 0b00000100 
in: 197, 0b11000101 out: 1, 0b00000001 
in: 198, 0b11000110 out: 2, 0b00000010 
in: 199, 0b11000111 out: 1, 0b00000001 
in: 200, 0b11001000 out: 8, 0b00001000 
in: 201, 0b11001001 out: 1, 0b00000001 
in: 202, 0b11001010 out: 2, 0b00000010 
in: 203, 0b11001011 out: 1, 0b00000001 
in: 204, 0b11001100 out: 4, 0b00000100 
in: 205, 0b11001101 out: 1, 0b00000001 
in: 206, 0b11001110 out: 2, 0b00000010 
in: 207, 0b11001111 out: 1, 0b00000001 
in: 208, 0b11010000 out: 16, 0b00010000 
in: 209, 0b11010001 out: 1, 0b00000001 
in: 210, 0b11010010 out: 2, 0b00000010 
in: 211, 0b11010011 out: 1, 0b00000001 
in: 212, 0b11010100 out: 4, 0b00000100 
in: 213, 0b11010101 out: 1, 0b00000001 
in: 214, 0b11010110 out: 2, 0b00000010 
in: 215, 0b11010111 out: 1, 0b00000001 
in: 216, 0b11011000 out: 8, 0b00001000 
in: 217, 0b11011001 out: 1, 0b00000001 
in: 218, 0b11011010 out: 2, 0b00000010 
in: 219, 0b11011011 out: 1, 0b00000001 
in: 220, 0b11011100 out: 4, 0b00000100 
in: 221, 0b11011101 out: 1, 0b00000001 
in: 222, 0b11011110 out: 2, 0b00000010 
in: 223, 0b11011111 out: 1, 0b00000001 
in: 224, 0b11100000 out: 32, 0b00100000 
in: 225, 0b11100001 out: 1, 0b00000001 
in: 226, 0b11100010 out: 2, 0b00000010 
in: 227, 0b11100011 out: 1, 0b00000001 
in: 228, 0b11100100 out: 4, 0b00000100 
in: 229, 0b11100101 out: 1, 0b00000001 
in: 230, 0b11100110 out: 2, 0b00000010 
in: 231, 0b11100111 out: 1, 0b00000001 
in: 232, 0b11101000 out: 8, 0b00001000 
in: 233, 0b11101001 out: 1, 0b00000001 
in: 234, 0b11101010 out: 2, 0b00000010 
in: 235, 0b11101011 out: 1, 0b00000001 
in: 236, 0b11101100 out: 4, 0b00000100 
in: 237, 0b11101101 out: 1, 0b00000001 
in: 238, 0b11101110 out: 2, 0b00000010 
in: 239, 0b11101111 out: 1, 0b00000001 
in: 240, 0b11110000 out: 16, 0b00010000 
in: 241, 0b11110001 out: 1, 0b00000001 
in: 242, 0b11110010 out: 2, 0b00000010 
in: 243, 0b11110011 out: 1, 0b00000001 
in: 244, 0b11110100 out: 4, 0b00000100 
in: 245, 0b11110101 out: 1, 0b00000001 
in: 246, 0b11110110 out: 2, 0b00000010 
in: 247, 0b11110111 out: 1, 0b00000001 
in: 248, 0b11111000 out: 8, 0b00001000 
in: 249, 0b11111001 out: 1, 0b00000001 
in: 250, 0b11111010 out: 2, 0b00000010 
in: 251, 0b11111011 out: 1, 0b00000001 
in: 252, 0b11111100 out: 4, 0b00000100 
in: 253, 0b11111101 out: 1, 0b00000001 
in: 254, 0b11111110 out: 2, 0b00000010 
+2

полоски все, кроме первого бита? – tarabyte

+0

@tarabyte: Выполнение этого на каждом uint16_t занимает меньше секунды: https://gist.github.com/sharth/40f9720f21fe520b3aa6 –

+0

no love for the op? – tarabyte

ответ

10

Мне кажется, что я находил самый правый 1 в битовой строке.

Посмотрите на 2 следующих случаях:

  • Число нечетно. В этом случае (n-1) будет одинаковым числом без последнего набора бит. Инвертируйте это, и вы получите маску с 0, где у оригинала 1, кроме последнего пятна.

Пример: п = 01101, (п-1) = 01100, ~ (п-1) = 10011, п & ~ (п-1) = 01101 & 10011 = 00001

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

Пример: п = 01100, (п-1) = 01011, ~ (п-1) = 10100, п & ~ (п-1) = 01100 & 10100 = 00100

3

Эта функция принимает целое число , и возвращает самый длинный суффикс этого целого числа, которое является степенью 2.

+0

'hmmm (0)' возвращает 0, что не является степенью 2. – chux

+0

Ну, @chux, мы можем спорить об этом, так как '0 = 2^-inf'.«Противоположное» выражение «n & (n - 1)» обычно используется для определения того, является ли «n» степенью 2. И это выражение ** также ** определяет, что 0 является степенью 2. –

+0

Хорошая точка, но '3 = 2^1.5849 ...' не делает 3 «мощностью 2», так как «1.5849 ...» не является целым числом. Итак, '-inf' целое число? – chux

0

Я считаю, что это очищает каждый бит, кроме первого включен бит ..

Предположим

n = ?????????10000 

набор битов затем 1, то некоторое количество нулей ..

п-1 будет выглядеть следующим образом

n-1 = ?????????01111 

~(n-1) = ~?~?~?~?~?~?~?~?~?10000 

то и оператор оставляет только первая часть

n = ?????????10000 &  ~(n-1) = ~?~?~?~?~?~?~?~?~?10000 
    result 00000010000 

Специально для нечетных чисел всегда одна причина первого включения кусал первый. Если n была мощностью 2, то, очевидно, она останется неизменной

Смежные вопросы