How to get position of right most set bit in C

前端 未结 15 1906
你的背包
你的背包 2020-12-09 04:48
int a = 12;

for eg: binary of 12 is 1100 so answer should be 3 as 3rd bit from right is set.

I want the position of the last most set bit o

相关标签:
15条回答
  • 2020-12-09 05:32

    Finding the (0-based) index of the least significant set bit is equivalent to counting how many trailing zeros a given integer has. Depending on your compiler there are builtin functions for this, for example gcc and clang support __builtin_ctz. For MSVC you would need to implement your own version, this answer to a different question shows a solution making use of MSVC intrinsics.

    Given that you are looking for the 1-based index, you simply need to add 1 to ctz's result in order to achieve what you want.

    int a = 12;
    int least_bit = __builtin_ctz(a) + 1; // least_bit = 3
    

    Note that this operation is undefined if a == 0. Furthermore there exist __builtin_ctzl and __builtin_ctzll which you should use if you are working with long and long long instead of int.

    0 讨论(0)
  • 2020-12-09 05:32

    You must check all 32 bits starting at index 0 and working your way to the left. If you can bitwise-and your a with a one bit at that position and get a non-zero value back, it means the bit is set.

    #include <limits.h>
    
    int last_set_pos(int a) {
      for (int i = 0; i < sizeof a * CHAR_BIT; ++i) {
        if (a & (0x1 << i)) return i;
      }
      return -1; // a == 0
    }
    

    On typical systems int will be 32 bits, but doing sizeof a * CHAR_BIT will get you the right number of bits in a even if it's a different size

    0 讨论(0)
  • 2020-12-09 05:33

    You can find the position of rightmost set bit by doing bitwise xor of n and (n&(n-1) )

    int pos = n ^ (n&(n-1));
    
    0 讨论(0)
提交回复
热议问题