Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Побитовые опеации


Автор: Diget 3.6.2008, 22:45
Помогите с такой вот задачкой: Определить, сколько раз в числе x встречаются набор из двоичных бит 1101.
Тут надо как-то наложить маску, но вот как это сделать я незнаю.

Автор: jonie 3.6.2008, 22:58
недумая яб сказал, например так:
Код

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


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

Автор: Diget 3.6.2008, 23:05
А можно это как-нибудь в Си перевести, а то я Си ++ не понимаю совсем

Автор: Diget 3.6.2008, 23:12
 я не понимаю совсем эти побитовые операции:( что с ними делать и как это делать...

Автор: mes 3.6.2008, 23:13
Цитата(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 

Автор: Diget 3.6.2008, 23:21
Спасибо большое. Сейчас гляну как она работает.

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

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

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

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

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

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

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

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

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

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

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

))

Автор: d06osipov 5.6.2008, 11:35
Цитата

if(n&0xD==0xD)

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

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

а может, ещё проще?
n & 0x0F == 0x0D

Автор: mes 5.6.2008, 12:10
Цитата(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 



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

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

Автор: mes 5.6.2008, 13:25
Цитата(d06osipov @  5.6.2008,  12:44 Найти цитируемый пост)
Это кстати тоже не работает. Надо (~n&~(0xD))==(~(0xD)), а это всё равно, что: ~(n||(0xD))==~(0xD) всё равно что (n||(0xD))==(0xD). Но не могу спорить, что n&0xF проще

чего то ты намудрил ... 

Rififi имел ввиду что n & 0x0F == 0x0D не проше чем (~n&~(0xD))==(~(0xD)), а проше чем выдумывать всякие "супер"-конструкции,
потому как все приведеные конструкции у которых в роли маски выступает 0xD не рабочие

кстати не пойму чего ты заклился когда выше приведен полностью рабочий вариант .
дублирую :
Цитата(mes @  3.6.2008,  23:13 Найти цитируемый пост)
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;
               };

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)