| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Побитовые опеации |
| Автор: Diget 3.6.2008, 22:45 |
| Помогите с такой вот задачкой: Определить, сколько раз в числе x встречаются набор из двоичных бит 1101. Тут надо как-то наложить маску, но вот как это сделать я незнаю. |
| Автор: jonie 3.6.2008, 22:58 | ||
недумая яб сказал, например так:
UPD. попоравил: не было присвоения после сдвига. |
| Автор: Diget 3.6.2008, 23:05 |
| А можно это как-нибудь в Си перевести, а то я Си ++ не понимаю совсем |
| Автор: Diget 3.6.2008, 23:12 |
| я не понимаю совсем эти побитовые операции:( что с ними делать и как это делать... |
| Автор: Diget 3.6.2008, 23:21 |
| Спасибо большое. Сейчас гляну как она работает. |
| Автор: jonie 4.6.2008, 01:08 |
| mes угу. я недоглядел. там дейтсвительно нету у меня присвоения. однако гонять до нуля не вижу смысла. т.к. если число будет меньше 0xD то оно никогда не будет совпадать по маске с 0xD.... |
| Автор: Ln78 4.6.2008, 07:21 | ||
jonie, смысл есть, так как число может быть не обязательно 0xD. Кроме того, условие в цикле неверно: проверяется как будто бы сдвиг был на байт (sizeof выдаёт не в битах), а сдвиг проводится на бит. Да и условие при подсчёте неверное: маска должна содержать все проверяемые разряды, иначе, например, 0xF по твоему условию тоже пройдёт. Исправив всё это, получишь решение, которое написал mes. |
| Автор: mes 4.6.2008, 11:09 |
jonie, имел ввиду меньше искомого числа - тут он прав но мне кажется ьту оптимизацию можно опереложить на плечи автора топика )) точно Ln78, внимательный! а я в условие не приглядывался - увидел что есть & и == значит правильно )) |
| Автор: Ln78 4.6.2008, 12:25 |
mes, так и я имел в виду именно искомое число. В условии стоит число разрядов, меньше которых смотреть не нужно. В том смысле, если бы искомая последовательность была 0001=0x1, то и условие тоже надо было бы менять. Без особой необходимости столь агрессивную оптимизацию я бы применять не стал. Это вообще нужно смотреть индивидуально, а то, может оказаться, что на сравнении не с нулём потеряем больше. Р.S. Хотя здесь не так: это неоднозначность в условии, можно ли дополнять нулями недостающее или нет. Если нельзя - то надо именно длину последовательности. |
| Автор: mes 4.6.2008, 12:46 | ||
согласен с тем , что если последовательность начинается с нуля, то надо менять условие поэтому написано: )) |
| Автор: d06osipov 5.6.2008, 11:35 | ||
Это не работает. Например, если n=1111111...1b, то n&0xD всегда будет равно 0xD. Чтобы точно сказать помоему надо ещё (n&~(0xD))==(~(0xD)). |
| Автор: Rififi 5.6.2008, 12:07 |
а может, ещё проще? n & 0x0F == 0x0D |
| Автор: mes 5.6.2008, 12:10 | ||||
уже Ln78, это уточнял :
Добавлено через 1 минуту и 5 секунд Rififi,успел раньше )) |
| Автор: d06osipov 5.6.2008, 12:44 |
Это кстати тоже не работает. Надо (~n&~(0xD))==(~(0xD)), а это всё равно, что: ~(n||(0xD))==~(0xD) всё равно что (n||(0xD))==(0xD). Но не могу спорить, что n&0xF проще |
| Автор: mes 5.6.2008, 13:25 | ||||
чего то ты намудрил ... Rififi имел ввиду что n & 0x0F == 0x0D не проше чем (~n&~(0xD))==(~(0xD)), а проше чем выдумывать всякие "супер"-конструкции, потому как все приведеные конструкции у которых в роли маски выступает 0xD не рабочие кстати не пойму чего ты заклился когда выше приведен полностью рабочий вариант . дублирую :
|