Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побитовые операции 
:(
    Опции темы
Winterlord
Дата 5.10.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Здравствуйте уважаемые читатели форума! СОвсем не представляю как сделать простейшую програмку на С++. Нужно вычислить номер позиции первого значащего символа. Всё это сделать с двоичным представлением числового значения при использовании типа Long int. Используя только самые простые команды (одно из условий задания) : |;&;<<;>>. Кто чем может помогите пожалуйста. Заранее благодарен. smile 
PM MAIL ICQ   Вверх
mes
Дата 5.10.2008, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Winterlord @  5.10.2008,  00:27 Найти цитируемый пост)
номер позиции первого значащего символа

первого значещего бита?

long int value;
int pos=0;
while ((value & (1<<i)) ==0)  ++pos;

И чего это я написал тут? Исправлено:
Код

int nn (unsigned x)
{
  if (x==0) return -1;
  int pos=0;
  while (!(x & 1)) ++pos, x>>=1;
  return pos;
}



Это сообщение отредактировал(а) mes - 5.10.2008, 12:21


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 5.10.2008, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



mes, у тя ерунда какаято написана

классический - вычисляется в худшем случае за время пропорциональное разрядности:
Код

int nnn1(unsigned x)
{
    int n = -1;

    for(; x; x >>= 1, ++n);

    return n;
}


оригинальный  smile - вычисляется за константное время пропорциональное двоичному логарифму разрядности:
Код

int nnn(unsigned x)
{
    int n = -1;

    if(x & 0xFFFF0000) x >>= 16, n += 16;
    if(x & 0x0000FF00) x >>= 8, n += 8;
    if(x & 0x000000F0) x >>= 4, n += 4;
    if(x & 0x0000000C) x >>= 2, n += 2;
    if(x & 0x00000002) x >>= 1, n += 1;
    n += x;

    return n;
}


обе функции возвращают номер (0-based) старшего бита либо -1 если передан 0


Это сообщение отредактировал(а) J0ker - 5.10.2008, 06:31


--------------------
user posted image
PM MAIL   Вверх
W4FhLF
Дата 5.10.2008, 06:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



J0ker, с каких пор нумерация битов осуществляется слева направо?

Добавлено через 11 минут и 39 секунд
Кстати, в современных x86-64 процессорах есть специальная команда для определения номера позиции в операнде самого младшего единичного бита -- BSF. Поэтому если забить на переносимость можно заюзать её, будет очень быстро:

Код

inline int leastSB(unsigned long x) 
{
    int n = 0;

    __asm bsf eax,x
    __asm mov n,eax

    return n;
}


Это для x86 под компилятор msvc++. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
W4FhLF
Дата 5.10.2008, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



А вот переносимый и тоже быстрый вариант: 

Код

inline int leastSB(unsigned long x) 
{
    static const int Mod37BitPosition[] =
    {
        32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4,
        7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5,
        20, 8, 19, 18
    };

    return Mod37BitPosition[(-x & x) % 37];
}


Деление можно заменить умножением. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
J0ker
Дата 5.10.2008, 07:13 (ссылка)    | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(W4FhLF @  5.10.2008,  06:44 Найти цитируемый пост)
J0ker, с каких пор нумерация битов осуществляется слева направо?

а почему вы у меня это спрашиваете????? если вы так считаете - это ваши проблемы  smile 

Цитата(W4FhLF @  5.10.2008,  06:44 Найти цитируемый пост)
Кстати, в современных x86-64 процессорах есть специальная команда для определения номера позиции в операнде самого младшего единичного бита -- BSF

если я прально понял - первый значащий - это старший  smile 


--------------------
user posted image
PM MAIL   Вверх
W4FhLF
Дата 5.10.2008, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Логично рассуждать так:

Первый == младший
Последний == старший

Нумерация справа налево, соответственно первый значащий == первый единичный справа. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
J0ker
Дата 5.10.2008, 07:35 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(W4FhLF @ 5.10.2008,  07:19)
Логично рассуждать так:

Первый == младший
Последний == старший

Нумерация справа налево, соответственно первый значащий == первый единичный справа.

если убрать слово "значащий" - то может быть
но пишем мы и читаем - слева на право (ну если вы конечно не в Израиле обитаете  smile 
поэтому ПЕРВЫЙ значащий - первый слева обычно

Добавлено через 5 минут и 42 секунды
впринципе недопонимание такого парадокса очевидно
в английском first significant означает не просто первый, а наиболее, самый


Это сообщение отредактировал(а) J0ker - 5.10.2008, 07:36


--------------------
user posted image
PM MAIL   Вверх
W4FhLF
Дата 5.10.2008, 07:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(J0ker @  5.10.2008,  07:35 Найти цитируемый пост)
но пишем мы и читаем - слева на право (ну если вы конечно не в Израиле обитаете   поэтому ПЕРВЫЙ значащий - первый слева обычно


Ага, значит в Израиле первый значащий это первый справа, а в Японии первый сверху... smile 

Надо подождать автора и уточнить, что именно он хотел. Я ответил то, что считал правильным исходя из своих собственных догадок, вполне логичных. Автору следует разобраться в терминологии и задавать вопросы более точно. 





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
J0ker
Дата 5.10.2008, 07:49 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(W4FhLF @  5.10.2008,  07:45 Найти цитируемый пост)
Ага, значит в Израиле первый значащий это первый справа, а в Японии первый сверху... 

вы хотите побеседовать на тему "право ли большинство?"  smile

Добавлено через 1 минуту и 58 секунд
большинство задачек по программированию - переводные, и обычно с английского
в английском first significant и most significant - эквивалентны


--------------------
user posted image
PM MAIL   Вверх
MAKCim
Дата 5.10.2008, 09:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(J0ker @  5.10.2008,  07:13 Найти цитируемый пост)
если я прально понял - первый значащий - это старший  

а еще на ассемблере лабаете...
у тебя LE или BE?

Цитата(J0ker @  5.10.2008,  07:49 Найти цитируемый пост)
в английском first significant и most significant - эквивалентны 

как бы first и most несколько разные слова, даже в прямом переводе

Это сообщение отредактировал(а) MAKCim - 5.10.2008, 09:43


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Winterlord
Дата 5.10.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Господа, нужно вычислить номер позиции первого значащего бита, тоесть единички. Задача усложняется тем, что никакого умножения\деления, использования цикла и прочее делать нельзя. Можно только логическое и\или и сдвиги влево и вправо, при этом использовать Long int
PM MAIL ICQ   Вверх
MAKCim
Дата 5.10.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(Winterlord @  5.10.2008,  10:14 Найти цитируемый пост)
Господа, нужно вычислить номер позиции первого значащего бита

первый справа или слева?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Winterlord
Дата 5.10.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Первый слева, первая единичка
PM MAIL ICQ   Вверх
mes
Дата 5.10.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Winterlord @  5.10.2008,  10:21 Найти цитируемый пост)
Первый слева, первая единичка 


Цитата(J0ker @  5.10.2008,  06:25 Найти цитируемый пост)
int nnn(unsigned x)
{
    int n = -1;
    if(x & 0xFFFF0000) x >>= 16, n += 16;
    if(x & 0x0000FF00) x >>= 8, n += 8;
    if(x & 0x000000F0) x >>= 4, n += 4;
    if(x & 0x0000000C) x >>= 2, n += 2;
    if(x & 0x00000002) x >>= 1, n += 1;
    n += x;
    return n;
}




--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0723 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.