![]() |
|
|
![]()
|
|
| cosmic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.9.2002 Репутация: нет Всего: нет |
всем привет, в общем, ничего, так сказать, путного у меня не выходит, короче...
только-то и надо, что подсчитать все нулевые биты в заданном байте, а также получить разряд первого (а можно и случайного...) нолика. вот... ах да, чуть не забыл - не используя циклов и рекурсий. дерзайте! победителя угощу мороженным! :) (билет в Хайфу за свой счёт) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Очень просто - целых 3 варианта 1) сравниваем все 8 бит по отдельности, в 8 строк кода 2) Сравниваем все восемь бит по одному в одной строке 3) Как я понимаю переходы по метке к циклам не относятся? не циклов не рекурсии - задача решена, условия соблюдены! -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| cosmic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.9.2002 Репутация: нет Всего: нет |
Vit, бегу за мороженным
э... приглядевшись: первое гениально, конечно, но... не то чтобы было жалко мороженного жду идей! |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Конечно же в байте 8 бит (не будем учитывать маразм про дополнительный девятый бит - контроль четности).
Как проверить биты думаю объяснять в деталях не надо? (AND с маской и SHR на нужное кол-во бит) Про метки весьма интересный вопрос. Будет ли это считаться циклом? (поидее будет) a: jmp a Чтобы получить кол-во ноликов можно все биты сложить -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Alex101 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
"Подсчитать" - определить только их количество, или номера тоже? -------------------- С уважением, А. Фролов. |
|||
|
||||
| Vit |
|
||||||||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Писать буду на Паскале... 1) сравниваем все 8 бит по отдельности, в 8 строк кода
2) Сравниваем все восемь бит по одному в одной строке
или другой вариант, действительно в одну строку:
3) Как я понимаю переходы по метке к циклам не относятся?
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||||||||
|
|||||||||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Знаешь, это не теорема, и даже не аксиома, просто принято что 1 байт это 8 бит, примерно так же как 1 метр это 100 сантиметров, а 1 килограм это 1000 грамм. По определению 8 и только 8, и даже девятый бит чётности - это дополнительный флаг, а вовсе не составная часть байта... В общем вся информатика стоит на том что: 1 байт = 8 бит 1 килобайт = 1024 байт 1 мегабайт = 1024 килобайт 1 гигабайт = 1024 мегабайт 1 терабайт = 1024 гигабайт 1 Слово = 2 байта 1 Длинное слово = 4 байта = 2 слова Никаких вариаций не предвидится, и новые открытия к изменению этих соотношений не приведут, может конечно появится что-то другое, но указанные единицы так и остануться и их соотношения будут прежними. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Вот, не то ли это - посмотри, пожалуйста (вторая ф-ция Get_NBits):
(код на СИ, который мне несколько непривычен - извини, если что):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| cosmic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.9.2002 Репутация: нет Всего: нет |
всем привет!
Alex101, да, определить их количество, а порядковый номер нужен только одного из них (первого, последнего, случайного, любого, в серединке и т.д.) равного 0. идея с восьмикратным повторением кода, [Vit 1], и то же самое "в одну строку" [Vit 2, Baa, Chingachguk], в общем, ясна. этим, как я понимаю, можно воспользоваться и при нахождении первого нулевого бита, так что код приводить не надо. Chingachguk - красиво получилось по поводу [Vit 3]: "мы тут посоветовались с народом и у народа есть мнение..." считать переход по меткам назад (!) циклом. ничего против переходов по меткам вперёд (если будут варианты) не предвижу. да, для нахождения нулевого бита (в данном случае старшего) я сначала хотел воспользоваться логарифмом по основанию 2, то есть как-то вот так: short f (BYTE byte) { return log (~ byte) / log (2); } а в случае равенства (~ byte) нулю каким-то образом отлавливать ошибку и делать вывод, что все биты = 1. (я прошу прощения, говорю только на Си, ~ - это как бы двоичное дополнение, или как оно там называется). меня только мучает вопрос, как функция логарифма реализована в математической библиотеке. если кто-то в курсе - расскажите. по-прежнему жду идей. самых бредовых, какие только придут вам в голову... Forth! |
|||
|
||||
| cosmic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.9.2002 Репутация: нет Всего: нет |
э... мда... про наболевшее. про 8 бит.
нет, основ информатики расшатывать мы не будем, пусть стоит пока, с ней как-то интересней. про то, что "в байте не всегда 8 бит", я где-то прочёл. это было в то время, когда я верил любому напечатанному слову, и задыхался от отсутствия литературы (а вернее просто от незнания того, какие книги надо искать и читать). поэтому в принципе, признаю всю критику в мой адрес, но... если кто-нибудь выдаст решение без привязки к цифре "8" или (хотябы) с использованием вместо неё макроопределения CHAR_BIT из файла limits.h в языке Си (аналогов в других языках я не знаю), то я предпочту это решение... и ещё... тема Dexter'а "байты и биты" Vit: ...я работал на системах с основаниями 5, 6, 7 - увеличение основания происходило с увеличением вычислительной мощности ? хочу комментариев! а пока можете рассказать, какое мороженное вам больше нравится |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Ну таймер используй...
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Мля! Хорошая задачка! Попробуем подойти с другой стороны. Как мы вообще можем это сделать?
1) Работать напрямую с битами. Тут нужен доступ к этим битам. Пути решения: а) В цикле, рекурсией - не подходит по условию задачи б) Простым перечислением - что я и продемонстрировал в) Использовать циклы и рекурсию операционной системы, компьютера, среды разработки. Т.е. код циклов не будет содержать, хотя они будут использоваться - например - вызовы таймера, использовать для выполнения повторяющихся действий каких-нибудь событий - например перерисовку формы, вместо рекурсии - создание классов в конструкторе другого класса и т.п. Но фактически приходим к пункту "1.а" - циклы в неявной форме 2) Работать со всем числом целиком а) Сравнить с уже известными значениями - ну в общем не сложно - определили массивы с числами... Думаю этот метод не понравится, так же как и 1.б (мне он тоже не нравится) б) Специальная математическая формула, позволяющая вычислить количество нулей. Я такой формулы не знаю - все действия с битами проводятся именно над битами и требуют бит за битом проверять - а это либо цикл либо рекурсия... Может кто знает, но я поспрашивал коллег, никто не смог вспомнить такой формулы. Итого! Из всех путей авторы топика имеют ввиду очевидно 2.б и я очень сомневаюсь, чтобы можно было решить проблему этим путём. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Попробуй посмотреть такой вариант - он без привязки к числу бит в байте:
А родной мне язык - ассемблер ;) ЗЫ: Есть еще один вариант, но он мне не нравится - нельзя сделать условную компиляцию (если число бит - такое-то, то код - такой-то):
(Тут также минус - константы заданы максимально возможные, что, в принципе, верно - но некрасиво...) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Вроде бы речь шла о том что надо без циклов, или "for (i=0;i<1024;i++)" в C++ за цикл не считается? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Это проверка ;) Код без циклов в проверяемой процедуре(Get_NBits) ;)
А C++ я еще не пробовал - это си вроде ... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |