Блог пользователя bajuddin15

Автор bajuddin15, история, 3 года назад, По-английски

how to find leftmost 1-bit in C++ ?

in other word I want to find biggest k so that 2^k <= N for some given number N

for example if N=10 then k=3

I want an O(1) time and memory solution and also without using built-in functions that may not compile in ALL C++ compilers.

thank you in advance.

plz tell me this is correct or not ?

------------------------------------------- int highestOneBit(int i) { i |= (i >> 1); i |= (i >> 2); i |= (i >> 4); i |= (i >> 8); i |= (i >> 16); return i — (i >> 1); }

  • Проголосовать: нравится
  • -3
  • Проголосовать: не нравится

»
3 года назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

__lg(n) will do your work.

  • »
    »
    3 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    without using built-in functions that may not compile in ALL C++ compilers?

  • »
    »
    3 года назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится

    I think this works for $$$O(log(log(n)))$$$. In order for it to work for $$$O(1)$$$, you need to add:

    #pragma GCC target ("popcnt")
    
»
3 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

this blog is copy pasted from here

»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

__builtin_clz or __builtin_clzll

  • »
    »
    3 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    in other word I want to find biggest k so that 2^k <= N for some given number N

    • »
      »
      »
      3 года назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      __builtin_clz does almost this. It counts number of leading zeros in binary, so 32 — return value is number of digits in binary representation of a number which is almost what you want to find. Now you need to just correct some off-by-one errors in what I said here.

»
3 года назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

In C++20 you can use std::bit_width(x) - 1.