powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Битовая операция
6 сообщений из 6, страница 1 из 1
Битовая операция
    #37028134
H.A.M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 64 бита (uint в .NET).
Надо максимально быстро получить позицию первого ненулевого бита.
Например:

X = 8;

8 10 == 1000 2 , т.е. надо получить: 3 (нумерация с 0), т.к. первая единица в этой позиции.

Пока только цикл приходит на ум:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for(int i =  0 ; i <  64 ; i++)
{
  if(( 1  << i) & X !=  0 )
  {
     return i;
  }
}

return - 1 ;

Или не стоит заморачиваться и использовать такой цикл, потому что экономия на спичках?
Распределение 1 в в этих 64 битах среднее, т.е. вероятность встретить 1 на любой позиции
одинаковая.

Пад'ехалi, лазер уключылi, i кабздец!
...
Рейтинг: 0 / 0
Битовая операция
    #37028222
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6374003 - читали?
...
Рейтинг: 0 / 0
Битовая операция
    #37029552
H.A.M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft 6374003 - читали?

Спасибо за линк.
Но у меня .NET, с asm туговато в .NET...
Попробую DLL на С++ вызвать с таким кодом в функции, посмотрю на результат.
...
Рейтинг: 0 / 0
Битовая операция
    #37029579
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.hardline.ru/1/5/1388/
Подсчитать номер младшего единичного бита (n должен быть ненулевым):

Привет для 32-битного числа.

Код: plaintext
1.
2.
3.
4.
5.
              k =  0 ;
              if((n & 0xFFFF) ==  0 )   k =  16 , n >>=  16 ;
              if((n & 0x00FF) ==  0 )   k +=  8 , n >>=  8 ;
              if((n & 0x000F) ==  0 )   k +=  4 , n >>=  4 ;
              if((n & 0x0003) ==  0 )   k +=  2 , n >>=  2 ;
              if((n & 0x0001) ==  0 )   k +=  1 ;
...
Рейтинг: 0 / 0
Битовая операция
    #37030559
Kew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Lowest = " + LowestBit(0x4500907000UL));
        }

        static int LowestBit(ulong test) {
            int[] pos = new int[64] { 0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 40, 5, 17, 26, 38, 15, 46, 29, 48, 10, 31, 35, 54, 21, 50, 41, 57, 63, 6, 12, 18, 24, 27, 33, 39, 16, 37, 45, 47, 30, 53, 49, 56, 62, 11, 23, 32, 36, 44, 52, 55, 61, 22, 43, 51, 60, 42, 59, 58 };
            test &= ~(test - 1);
            return pos[(test * 0x0218A392CD3D5DBFL) >> 58];
        }
    }
...
...
Рейтинг: 0 / 0
Битовая операция
    #37030811
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
[SRC C]switch(X ^ (X-1)) {
case 0x1: return 0;
case 0x3: return 1;
case 0x7: return 2;
case 0xF: return 3;
case 0x1F: return 4;
.......
default: return -1;
}
[/SRC]
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Битовая операция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]