2010-06-20 5 views
4

Если у меня есть целое число в Java, как мне подсчитать, сколько бит равно нулю, кроме начальных нулей?Число нулевых битов в целых числах, кроме ведущих нулей

Мы знаем, что целые числа в Java имеют 32 бита, но подсчитывают количество заданных битов в числе, а затем вычитание из 32 не дает мне того, что я хочу, потому что это также будет включать в себя начальные нули.

В качестве примера, число 5 имеет один нулевой бит, поскольку в двоичном виде это 101.

+1

Определение "не правильно". – Stephen

+0

Я отредактировал вопрос на основе комментария, опубликованного в моем первоначальном ответе. –

+0

См .: http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#bitCount(int) и http://java.sun.com/javase/6/docs /api/java/lang/Integer.html#numberOfLeadingZeros(int) – laura

ответ

3

Подсчитать, не ведущие нули в Java вы можете использовать этот алгоритм:

public static int countNonleadingZeroBits(int i) 
{ 
    int result = 0; 
    while (i != 0) 
    { 
     if (i & 1 == 0) 
     { 
      result += 1; 
     } 
     i >>>= 1; 
    } 
    return result; 
} 

Этот алгоритм будет достаточно быстро, если ваши входы, как правило, небольшие, но если ваш вход, как правило, большее количество может быть быстрее использовать вариацию на одном из алгоритмов бит-хака на this page.

+0

да, но с номером 5 // 101 здесь 1 ноль, а не 30 –

+1

@ davit-datuashvili: Итак, вы хотите подсчитать нули от начальных нулей? –

+0

'5 = 000 ... 000101'. Вещь, которую вы хотите, - это номер последнего (наиболее значимого) бита, который установлен плюс одно и минус количество бит, которое установлено. – ony

1

Подсчитайте общее количество «бит» в вашем номере, а затем вычтите количество единиц из общего количества бит.

1

Это то, что я бы сделал.

public static int countBitsSet(int num) { 
    int count = num & 1; // start with the first bit. 
    while((num >>>= 1) != 0) // shift the bits and check there are some left. 
     count += num & 1; // count the next bit if its there. 
    return count; 
} 

public static int countBitsNotSet(int num) { 
    return 32 - countBitsSet(num); 
} 
+0

«32-x» - это не то, что хочет OP. Биты, которые подсчитываются, не все 32, это только до последнего установленного бита. (Он просто не объяснил это в исходном вопросе) – Stephen

-2

Поскольку порядок оценки в Java является defined, мы можем сделать это:

public static int countZero(int n) { 
    for (int i=1,t=0 ;; i<<=1) { 
     if (n==0) return t; 
     if (n==(n&=~i)) t++; 
    } 
} 

Обратите внимание, что это опирающийся на LHS из равенства оценивается первым; попробуйте то же самое в C или C++, и компилятор может заставить вас выглядеть глупо, если вы загорелись.

+2

-1 Для крайне нечитаемого кода. – starblue

0

Используя некоторые встроенные функции:

public static int zeroBits(int i) 
{ 
    if (i == 0) { 
     return 0; 
    } 
    else { 
     int highestBit = (int) (Math.log10(Integer.highestOneBit(i))/
       Math.log10(2)) + 1; 
     return highestBit - Integer.bitCount(i); 
    } 
} 
6

Взгляните на документацию API в Integer:

32 - Integer.numberOfLeadingZeros(n) - Integer.bitCount(n) 
Смежные вопросы