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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побитовые опеации, Наложение маски 
:(
    Опции темы
Diget
Дата 3.6.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите с такой вот задачкой: Определить, сколько раз в числе x встречаются набор из двоичных бит 1101.
Тут надо как-то наложить маску, но вот как это сделать я незнаю.
PM MAIL   Вверх
jonie
Дата 3.6.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



недумая яб сказал, например так:
Код

int n;
int count = 0;
for(int i=sizeof(n);i>3;--i)
{
  if(n&0xD==0xD) count++;
  n>>=1;
}


UPD. попоравил: не было присвоения после сдвига.

Это сообщение отредактировал(а) jonie - 4.6.2008, 01:09


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Diget
Дата 3.6.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно это как-нибудь в Си перевести, а то я Си ++ не понимаю совсем
PM MAIL   Вверх
Diget
Дата 3.6.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 я не понимаю совсем эти побитовые операции:( что с ними делать и как это делать...
PM MAIL   Вверх
mes
Дата 3.6.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Diget @  3.6.2008,  22:45 Найти цитируемый пост)
Помогите с такой вот задачкой: Определить, сколько раз в числе x встречаются набор из двоичных бит 1101.

вот.. адаптируй под свои нужды ))
Код

const size_t mask = 15; // 00001111b

size_t value = 65535-2-32-512-8192; // произвольное число //  результат должен быть 4
size_t bits  = 13;  // 00001101b

int count = 0;
 while (value) { if ( (value & mask)  == bits) ++count;
                 value >>=1;
               };


Добавлено через 1 минуту и 18 секунд
опоздал опять ))

Добавлено через 2 минуты и 40 секунд
Цитата(jonie @  3.6.2008,  22:58 Найти цитируемый пост)
  n>>1;

n>>=1;  smile 


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


Новичок



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

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



Спасибо большое. Сейчас гляну как она работает.
PM MAIL   Вверх
jonie
Дата 4.6.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



mes угу. я недоглядел. там дейтсвительно нету у меня присвоения.
однако гонять до нуля не вижу смысла. т.к. если число будет меньше 0xD то оно никогда не будет совпадать по маске с 0xD....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ln78
Дата 4.6.2008, 07:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  4.6.2008,  02:08 Найти цитируемый пост)
однако гонять до нуля не вижу смысла. т.к. если число будет меньше 0xD то оно никогда не будет совпадать по маске с 0xD.... 

jonie, смысл есть, так как число может быть не обязательно 0xD. Кроме того, условие в цикле неверно: проверяется как будто бы сдвиг был на байт (sizeof выдаёт не в битах), а сдвиг проводится на бит. Да и условие при подсчёте неверное: маска должна содержать все проверяемые разряды, иначе, например, 0xF по твоему условию тоже пройдёт. Исправив всё это, получишь решение, которое написал mes. 

Это сообщение отредактировал(а) Ln78 - 4.6.2008, 07:22
PM MAIL   Вверх
mes
Дата 4.6.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Ln78 @  4.6.2008,  07:21 Найти цитируемый пост)
так как число может быть не обязательно 0xD.

jonie,  имел ввиду меньше искомого числа - тут он прав 
но мне кажется ьту оптимизацию можно опереложить на плечи автора топика ))
Цитата(Ln78 @  4.6.2008,  07:21 Найти цитируемый пост)
как будто бы сдвиг был на байт (sizeof выдаёт не в битах), 

точно  smile 
Цитата(Ln78 @  4.6.2008,  07:21 Найти цитируемый пост)
: маска должна содержать все проверяемые разряды

Ln78,  внимательный! а я в условие  не приглядывался - увидел что есть & и == значит правильно ))

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


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


Опытный
**


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

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



Цитата(mes @  4.6.2008,  12:09 Найти цитируемый пост)
jonie,  имел ввиду меньше искомого числа - тут он прав 

mes, так и я имел в виду именно искомое число. В условии стоит число разрядов, меньше которых смотреть не нужно. В том смысле, если бы искомая последовательность была 0001=0x1, то и условие тоже надо было бы менять. Без особой необходимости столь агрессивную оптимизацию я бы применять не стал. Это вообще нужно смотреть индивидуально, а то, может оказаться, что на сравнении не с нулём потеряем больше.
Р.S. Хотя здесь не так: это неоднозначность в условии, можно ли дополнять нулями недостающее или нет. Если нельзя - то надо именно длину последовательности.

Это сообщение отредактировал(а) Ln78 - 4.6.2008, 12:28
PM MAIL   Вверх
mes
Дата 4.6.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Ln78 @  4.6.2008,  12:25 Найти цитируемый пост)
mes, так и я имел в виду именно искомое число. В условии стоит число разрядов, меньше которых смотреть не нужно. В том смысле, если бы искомая последовательность была 0001=0x1, то и условие тоже надо было бы менять. Без особой необходимости столь агрессивную оптимизацию я бы применять не стал. Это вообще нужно смотреть индивидуально, а то, может оказаться, что на сравнении не с нулём потеряем больше.

согласен с тем , что если последовательность начинается с нуля, то  надо менять условие 
поэтому  написано:  
Цитата(mes @  3.6.2008,  23:13 Найти цитируемый пост)
вот.. адаптируй под свои нужды ))

))



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


Шустрый
*


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

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



Цитата

if(n&0xD==0xD)

Это не работает. Например, если n=1111111...1b, то n&0xD всегда будет равно 0xD. Чтобы точно сказать помоему надо ещё (n&~(0xD))==(~(0xD)).

PM MAIL   Вверх
Rififi
Дата 5.6.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



Цитата(d06osipov @  5.6.2008,  11:35 Найти цитируемый пост)
(n&~(0xD))==(~(0xD))

а может, ещё проще?
n & 0x0F == 0x0D
PM MAIL   Вверх
mes
Дата 5.6.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(d06osipov @  5.6.2008,  11:35 Найти цитируемый пост)
Это не работает. Например, если n=1111111...1b, то n&0xD всегда будет равно 0xD. Чтобы точно сказать помоему надо ещё (n&~(0xD))==(~(0xD)).

уже Ln78, это уточнял :
Цитата(Ln78 @  4.6.2008,  07:21 Найти цитируемый пост)
. Кроме того, условие в цикле неверно: проверяется как будто бы сдвиг был на байт (sizeof выдаёт не в битах), а сдвиг проводится на бит. Да и условие при подсчёте неверное: маска должна содержать все проверяемые разряды, иначе, например, 0xF по твоему условию тоже пройдёт


Добавлено через 1 минуту и 5 секунд
Rififi,успел раньше ))
  
Цитата(Rififi @  5.6.2008,  12:07 Найти цитируемый пост)
n & 0x0F == 0x0D 





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


Шустрый
*


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

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



Цитата(d06osipov @  5.6.2008,  11:35 Найти цитируемый пост)
(n&~(0xD))==(~(0xD))

Это кстати тоже не работает. Надо (~n&~(0xD))==(~(0xD)), а это всё равно, что: ~(n||(0xD))==~(0xD) всё равно что (n||(0xD))==(0xD). Но не могу спорить, что n&0xF проще

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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