Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Сколько 1-ых битов в байте? :)   Найти похожие ветки 

 
Соловьев ©   (2004-05-27 09:35) [0]

Форумчане, предлагаю конкурс, кто предложит самый оптимальный способ подсчета сабжа. Надо написать функцию на вход которой подается байт, и надо получить на выходе количество 1-ых битов. Это я вчера проходил тест на фирму - "МаксБилл". Надо было использовать С. мой вариант вышел такой, что не налазит ни накакие ворота :)

char cnt_bit(char in)
{
char result=0, temp=in;
while( temp ){
 if( 255 == (254|temp) )result++;  
 temp--;
}
return result;
}

Это как из Харькова ехать в Москву через Владивосток. Как оказалось решение очень интересное и самое главное очень простое :)
кто решит? можно и на Паскале. Главное быстродействие. Удачи


 
Anatoly Podgoretsky ©   (2004-05-27 09:44) [1]

Критерий оптимальности какой?


 
Соловьев ©   (2004-05-27 09:44) [2]

Быстродействие


 
Ega23 ©   (2004-05-27 09:45) [3]

1-ых - это "Первых" или "Имеющих значение 1"?


 
Anatoly Podgoretsky ©   (2004-05-27 09:47) [4]

Тогда по таблице из 2^SizeOf(Byte) элементов


 
Соловьев ©   (2004-05-27 09:47) [5]


> [3] Ega23 ©   (27.05.04 09:45)

Функция должна выдать - сколько еденичных битов в байте.


 
Соловьев ©   (2004-05-27 09:48) [6]


> [4] Anatoly Podgoretsky ©   (27.05.04 09:47)

подробнее можно?


 
Danilka ©   (2004-05-27 09:48) [7]

Дык, вроде было что-то похожее на прошлой неделе в основной, или нет?

[3] Ega23 ©   (27.05.04 09:45)
Ка я понял, если записать значение в двоичном виде будут нолики и единички. подсчитать скока единичек.


 
jack128 ©   (2004-05-27 09:49) [8]

Была тут ветка про красивый код, вот оттуда

[7] Aldor ©   (18.05.04 21:34)
Из красивого: функция возвращает количество бит в двоичной записи числа

int BitCount(int num)
{
for (int count = 0; num; count++)
  num &= num - 1  
}


 
Anatoly Podgoretsky ©   (2004-05-27 09:49) [9]

Да еще в этом случае и функция не нудна, дополнительное повышение быстродействия, выгдяит так Count := BitsTbl[Byte];


 
jack128 ©   (2004-05-27 09:50) [10]

только return count забыли


 
Соловьев ©   (2004-05-27 09:50) [11]


>  [8] jack128 ©   (27.05.04 09:49)

нет, это не будет самым быстрым


 
Соловьев ©   (2004-05-27 09:51) [12]


> [9] Anatoly Podgoretsky ©   (27.05.04 09:49)

:)
правильно
А что в таблице?


 
Anatoly Podgoretsky ©   (2004-05-27 09:57) [13]

Соловьев ©   (27.05.04 09:51) [12]
А в таблице прописано количество еддиниц для каждого значения байта, в случае 8 битных байт это числа от 9 до 8. Таблица описывается в виде константного массива

const
  BitsTbl: array[Byte] of byte = (значения);


 
Соловьев ©   (2004-05-27 09:59) [14]


> [13] Anatoly Podgoretsky ©   (27.05.04 09:57)

Правильно.


 
Ваххабит   (2004-05-27 10:08) [15]

Отряд из восьми ваххабитов = один ваххобайт.


 
Vlad Oshin ©   (2004-05-27 10:15) [16]

а 0-1 это сексуальная ориентация членов отряда


 
MBo ©   (2004-05-27 10:15) [17]


function Count1Bits(b:byte):byte;
asm
 mov edx,eax
 and eax,$55
 shr edx,1
 and edx,$55
 add eax,edx
 mov edx,eax
 and eax,$33
 shr edx,2
 and edx,$33
 add eax,edx
 mov edx,eax
 and eax,$F
 shr edx,4
 and edx,$F
 add eax,edx
end;


 
MBo ©   (2004-05-27 10:17) [18]

Паскальный бестабличный аналог :

b:=(b and $55)+((b shr 1) and $55);
b:=(b and $33)+((b shr 2) and $33);
Result:=(b and $F)+((b shr 4) and $F);


 
WondeRu ©   (2004-05-27 10:20) [19]

bb1 - твой байт

 xor edx,edx
 mov al, bb1
 mov ecx,8
loop1:
 bt al,cl
 jnc m1
 inc edx
m1:
 loop loop1

edx - количество 1-х бит


 
Соловьев ©   (2004-05-27 10:20) [20]


> [17] MBo ©   (27.05.04 10:15)


> [18] MBo ©   (27.05.04 10:17)

На сколько я знаю - выбать значение из ячейки памяти все-таки быстрее будет, чем суммирование, а насчет асма не знаю, может и самый быстрый способ


 
jack128 ©   (2004-05-27 10:28) [21]


> нет, это не будет самым быстрым
но затоо красиво :-)

а самый быстрый уже предложили..


 
Bless ©   (2004-05-27 11:46) [22]

MBo ©[18]>

Пусть меня покрасят, если я понял, как это работает! Не объяснишь логику? В смысле, как это в голову пришло, как рассуждал?


 
Bless ©   (2004-05-27 11:55) [23]

to Mbo>
Хотел посмотреть твою анкету. Не найдена. Так и было задумано или регистрация пропала?


 
MBo ©   (2004-05-27 12:03) [24]

>Соловьев
Да, конечно, табличный способ намного быстрее всех других за счет траты памяти. Приведенный код не имеет особого смысла для байта, но вот его модификация для 32-х или 64-х разрядных чисел совсем неплоха, поскольку имеет алг. сложность O(logN), а не O(N), которая будет, например, у алгоритма типа
for i:=0 to N-1 do begin
 if Odd(b) then Inc(ButCount);
 b:=b shr 1;
end;


 
Соловьев ©   (2004-05-27 12:07) [25]


> [24] MBo ©   (27.05.04 12:03)

как раз требуется скорость - память не важна


 
Anatoly Podgoretsky ©   (2004-05-27 12:16) [26]

Модифицируется обращением к отдельным байтам и суммированием результатов.


 
Mystic ©   (2004-05-27 12:20) [27]

Классику надо знать ;)
http://russian.joelonsoftware.com/Articles/Interviewing.html

3. Посчитать все ненулевые биты в байте.

Третья задача показывает, насколько хорошо они учили побитовые операторы в Си... но это уже навык, а не способность, и тут им можно помочь. Интересно посмотреть, как они пишут программу, пересчитывающую все биты в байте, а потом попросить сделать это гораздо, гораздо быстрее. Сообразительный кандидат создаст поисковую таблицу (там ведь всего 256 значений), заполняемую только один раз. С хорошим кандидатом можно даже завести интересную беседу о компромиссах между скоростью выполнения и требуемой памятью. Поднажмите. Скажите, что не хотите тратить время на создание таблицы при инициализации. Очень умные кандидаты могут даже предложить схему кэширования, где биты считаются при первом использовании и сохраняются в таблице, чтобы не пересчитывать их в следующий раз. А самые умные попробуют изобрести способ вычисления значений таблицы, используя для этого некие расширенные методы программирования.


Итого --- не взяли?


 
MBo ©   (2004-05-27 12:34) [28]

>Соловьев
Я все понимаю ;)

>Bless ©   (27.05.04 11:46) [22]
Идея не моя. Числа $55,$33,$F предсталяют собой битовые маски для выделения четных битов, групп по 2 и по 4 бита соответственно
$55=01010101B
$33=00110011B
На первом шаге мы выделяем четные и нечетные биты, второе число сдвигаем и складываем. При этом из числа, например, 00001100B получатся
00000100 и 00000100 (старший бит каждого слагаемого всегда нулевой). Сложив их, получим 00001000B. Следующий шаг требует сдвига на 2, пары битов выделяются, получим 0 и 00000010, и сумма 00000010. Последний шаг для взятого числа (старший ниббл-полубайт нулевой) ничего не изменит, так и останется 00000010B=2


 
Соловьев ©   (2004-05-27 12:44) [29]


> Итого --- не взяли?

это мне?


 
вразлет ©   (2004-05-27 12:54) [30]

Сколько 1-ых битов в байте?

в любом байте первый бит всегда один)


 
Sergp ©   (2004-05-27 12:55) [31]


> в любом байте первый бит всегда один)


А если учесть что может быть первый сзади и первый спереди, то два.. :-))


 
Bless ©   (2004-05-27 12:58) [32]

MBo © [28]>

Дык, я ж не о том спросил. Что каждая строчка кода делает, я и сам понимаю. Но каким образом эти действия приводят к желаемому результату, я никак не могу понять.

Для меня не очевидно, что эта последовательность действий для любого байта вернет правильный результат. Но ведь вернет же!

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


 
Alx2 ©   (2004-05-27 13:02) [33]

>Bless ©   (27.05.04 12:58) [32]
На первом шаге мы резервируем четыре счетчика - столько пар бит в байте. В итоге после первой операции в каждой паре бит будет храниться 0, 1, либо 10 (двоичная двойка), что будет означать сумму соседних бит.
На втором шаге получим два счетчика - четверки бит. Каждая четверка будет содержать сумму соседних двух счетчиков (двубитных) предыдущего шага.
Наконец, на третьем шаге, складываем значения двух четырехбитных счетчиков и получаем итоговую сумму бит.


 
Anatoly Podgoretsky ©   (2004-05-27 13:02) [34]

Bless ©   (27.05.04 12:58) [32]
А ты поиграйся на бумаге с разными значениями, чтобы визуально видеть, что происходит при этом.


 
MBo ©   (2004-05-27 13:11) [35]

Вот еще из занятных трюков (меняет n-й и m-й биты числа)

function BitSwap(i:Integer; n,m:byte):Integer;
begin
if Odd((i shr n) xor (i shr m)) then //биты различны
 Result:=i xor ((1 shl m) xor (1 shl m))
else
 Result:=i;
end;


 
Alx2 ©   (2004-05-27 13:14) [36]

>MBo ©   (27.05.04 13:11) [35]
Опечятка:
Result:=i xor ((1 shl m) xor (1 shl n))

:)


 
MBo ©   (2004-05-27 13:21) [37]

>Alx2 ©   (27.05.04 13:14) [36] Опечятка:
Угу ;(


 
Думкин ©   (2004-05-27 13:23) [38]

> Bless ©   (27.05.04 12:58) [32]

В свое время я благоговел глядя на картину "Трудная задача". Всему свое время.


 
MBo ©   (2004-05-27 13:31) [39]

>Думкин ©   (27.05.04 13:23) [38]
Да ладно тебе, код действительно нетривиальный. Самому такое придумать - крыша может поехать ;)
(анонс - в завтрашних задачках будет о едущей крыше ;)))


 
Bless ©   (2004-05-27 13:38) [40]

MBo ©  (27.05.04 13:31) [39]
> в завтрашних задачках будет о едущей крыше ;)))
У меня еще от бегущей вокруг строя собачки крыша едет :) До сих пор перед сном решаю. Кстати, ее решил кто-то в той ветке или нет (только ответ не говори) ?


 
MBo ©   (2004-05-27 13:42) [41]

>Bless
Да, решили.


 
MBo ©   (2004-05-27 13:50) [42]

>Bless ©
Если ты решаешь 1б, то учти, что выражение довольно сложное - так и должно быть


 
вразлет ©   (2004-05-27 13:52) [43]

MBo ©
Почему же нетривиальный? Метод деления пополам. Каждый из нас его использует при локализации ошибок в програме


 
вразлет ©   (2004-05-27 13:52) [44]

мм


 
Bless ©   (2004-05-27 14:02) [45]

Alx2 [33]>

Спасибо за объяснение. Дошло :)


 
Mystic ©   (2004-05-27 14:23) [46]

>> Итого --- не взяли?
> это мне?


Ну интересно же...


 
Соловьев ©   (2004-05-27 14:33) [47]

прочитал статью - они вели себя как там написано, а там написано что если сомневаешся то не бери. А они сказали , что на 95% я им подхожу, а на 5% сомневаются :)

Ксати, может и расстраиваться не стоит? Как Вам "МаксБилл" - кто нибудь хорошее или плохое сказать может?


 
MBo ©   (2004-05-27 14:38) [48]

>Соловьев
А много ли было задачек и как остальные решил?
Эту, конечно, стоило сделать, но понятно, что не всегда можно сразу сообразить, бывает, зациклишься на неверном варианте (или не не том, который от тебя ждут :)).


 
Соловьев ©   (2004-05-27 14:55) [49]


> А много ли было задачек и как остальные решил?

Были вопросы по SQL - решил половину.
Оракл не знаю, но решил 10% :)
Delphi - тоже половину
RDBMS тоже не знаю, но решил 40 % :)


 
Mystic ©   (2004-05-27 15:15) [50]


> Ксати, может и расстраиваться не стоит? Как Вам "МаксБилл"
> - кто нибудь хорошее или плохое сказать может?


Я давно там собеседовался... Тогда еще им эта статья была неизвестной ;) Мне объяснили, что за фирма, сказали, что им нужен программист с глубинными знаниями VCL. Я сказал, что этими знаниями обладаю. Потом спросили знали я SQL. Я ответил, что знаю. Сказали, что они специализируюсят на Oracle и MS SQL. Я сказал, что работал с MS SQL. Спросили --- могу ли я писать компоненты. Я сказал, что могу. Потом нехорошо маякнули, что поскольку я буду не успевать выполнять их задания во время, то согласен ли я оставаться после конца рабочего дня? Последнее их слово было ждите. Жду до сегодняшнего дня ;)


 
Соловьев ©   (2004-05-27 15:19) [51]


> [50] Mystic ©   (27.05.04 15:15)

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


 
Соловьев ©   (2004-05-27 15:20) [52]


> Потом нехорошо маякнули, что поскольку я буду не успевать
> выполнять их задания во время, то согласен ли я оставаться
> после конца рабочего дня?

да :)
говорят у нас есть - овертайм. Я говорю и как часто? сказали, если курить меньше будешь, то его нет. а я не курю:) в общем мне не грозит работа по выходным :))))


 
Mystic ©   (2004-05-27 15:55) [53]

Просто это было несколько лет назад. Насколько до меня доходили слухи, то, в отличие, например, от МИИТ, estimate-лист (работы, время выполнения) там никак не согласовывается с тобой лично, и строится с таким расчетом, чтобы ты его сделать не успел.

Я бы порекомендовал попытаться устроиться в МИИТ (там недавно был набор).


 
Соловьев ©   (2004-05-27 15:59) [54]


> бы порекомендовал попытаться устроиться в МИИТ (там недавно
> был набор).

МИИТ? МИИК может?
У меня там друг работает, классная кантора, но им надо знание Оракла и Явы, а этого увы не знаю, хочу, но не знаю. Буду учить...


 
Mystic ©   (2004-05-27 16:10) [55]

МИИТ = МИИК. Я их всегда путаю... Там, кстати, недавно были вакансии на С++. Можешь еще сюда обратиться:

http://via.com.ua/jobs/jobs.aspx


 
Соловьев ©   (2004-05-27 16:37) [56]


> http://via.com.ua/jobs/jobs.aspx

У меня ни одна кодировка не подходит... В какой их сайт?


 
app ©   (2004-05-27 16:48) [57]

Мыжики считаем биты в байте или заводим отдельную ветку


 
Соловьев ©   (2004-05-27 16:55) [58]


> [57] app ©   (27.05.04 16:48)

закрываем тему :)
разобрался.



Страницы: 1 2 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.026 c
1-1085908028
ilnarab
2004-05-30 13:07
2004.06.13
Как с помощью OpenDialog-а загрузить в ListBox текстовый файл


3-1085032891
Alex_x
2004-05-20 10:01
2004.06.13
технология доступа в MIDAS?


14-1085546854
Vlad Oshin
2004-05-26 08:47
2004.06.13
Чем Касперский занимается...


3-1085031404
Vogul
2004-05-20 09:36
2004.06.13
Отображение больших объемов данных в Dataset


14-1085451868
gn
2004-05-25 06:24
2004.06.13
M$ Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский