Meaning of bitwise and(&) of a positive and negative number?

后端 未结 8 1846
名媛妹妹
名媛妹妹 2021-02-04 11:59

Can anyone help what n&-n means?? And what is the significance of it.

相关标签:
8条回答
  • 2021-02-04 12:47

    N&(-N) will give you position of the first bit '1' in binary form of N. For example:

    N = 144 (0b10010000) => N&(-N) = 0b10000
    N = 7 (0b00000111) => N&(-N) = 0b1
    

    One application of this trick is to convert an integer to sum of power-of-2. For example:

    To convert 22 = 16 + 4 + 2 = 2^4 + 2^2 + 2^1
    22&(-22) = 2, 22 - 2 = 20
    20&(-20) = 4, 20 - 4 = 16
    16&(-16) = 16, 16 - 16 = 0
    
    0 讨论(0)
  • 2021-02-04 12:51

    It's an old trick that gives a number with a single bit in it, the bottom bit that was set in n. At least in two's complement arithmetic, which is just about universal these days.

    The reason it works: the negative of a number is produced by inverting the number, then adding 1 (that's the definition of two's complement). When you add 1, every bit starting at the bottom that is set will overflow into the next higher bit; this stops once you reach a zero bit. Those overflowed bits will all be zero, and the bits above the last one affected will be the inverse of each other, so the only bit left is the one that stopped the cascade - the one that started as 1 and was inverted to 0.

    P.S. If you're worried about running across one's complement arithmetic here's a version that works with both:

    n & (~n + 1)
    
    0 讨论(0)
提交回复
热议问题