n& 〜(n - 1)这个功能有什么作用?

时间:2014-02-01 19:09:48

标签: c

我被问到这个问题并打印出试图寻找模式的表格,但仍然没有看到任何意义。

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

数字滤波器的一部分?如果打印出双螺旋动画?

我真的很想知道这个人是否意味着n& (n - 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

3 个答案:

答案 0 :(得分:10)

在我看来,在bitstring中找到最右边的1。

请看下面两个案例:

  • 这个数字很奇怪。在那种情况下(n-1)是相同的数字而没有设置最后一位。反转,然后你得到一个0的掩码,原始的除了最后一个点之外有1个。

示例:n = 01101,(n-1)= 01100,〜(n-1)= 10011,n& 〜(n-1)= 01101& 10011 = 00001

  • 数字是均匀的。然后同样的情况适用于情况1,除了在AND操作期间最后1的右边的所有位都是0。

示例:n = 01100,(n-1)= 01011,〜(n-1)= 10100,n& 〜(n-1)= 01100& 10100 = 00100

答案 1 :(得分:3)

此函数采用整数,并返回此整数的最长后缀,即2的幂。

答案 2 :(得分:0)

我相信它除了第一个开启位之外每一点都清除..

假设

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

一组比特然后是1然后是一些零...

n-1将如下所示

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

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

然后,运算符只留下第一部分

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

特别是对于奇数,它总是1,因为第一个开启时它是第一个。如果n是2的幂,那么显然它将保持不变