1. JavaScript / Говнокод #3728

    +174

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function BIN(a) {
    	var x = false;
    	for (var i = 0; i < 50; i++) {
    		if (Math.pow(2, i) == a) {
    			x = true;
    		}
    	}
    	return x;
    }

    Проверка числа на степень двойки.

    Запостил: eval, 18 Июля 2010

    Комментарии (93) RSS

    • 0x4000000000000 уже false, что примечательно.
      а сдвигов мы не знаем, да
      Ответить
      • про сдвиги знают только те, кто пишет(или писал) на языках более низкого уровня. а для веб-кодеров это что-то страшное и не понятное...
        Ответить
        • ну еще есть логарифмы...
          Ответить
        • и вообще, я думал, С\С++, ассм - обязательное в универе
          Ответить
          • Кстати, логарифмы с произвольными основаниями еще в школьном курсе алгебры присутствуют
            Ответить
          • 1: не каждый веб-кодер учился в универе
            2: обучение в универе - гавно, хотя и те кто учатся - тоже (мб конечно это зависит от универа, но всёже)

            пример УГ:
            в универе, где я учусь, всё обучение программингу построено на паскале:
            - все курсаки и дипломки - Делфи (БД : Парадокс)
            - курс ООП -- фактически сводился к изучению стандартных компонентов Делфи
            - курс С/С++ занимал 1 семестр (после изучения паскаля в 3 семестра), препом, который с трудом мог выразить свои мысли;
            - асм 2 семестра, базовые понятия: за всё это время, преп появился лишь 4 раза (2 раза на экзаменах и 2 раза в начале семестров);
            - избыток гуманитария (каждый семестр по 2 курса гуманитария: история, культурология, 2 философии, экономика, психология, языковедение и т.п.)
            - деморализация : тем кто нихрена не делает и нихрена не знает(девушки и некоторые парни) ставят наивысшие баллы и дают повышенную стипендию...

            итог:
            - 4 года потрачено в пустую (заданий много, толку с них практически нету: 1 месяц каникул прошёл гораздо продуктивнее, чем 1 год обучения в универе)
            - ненависть к паскалю (делфи)
            - ненависть к людям

            зы: как оказалось, программа обучения по которой мне пришлось обучаться - это была довольно хорошей.
            у тех кто на курс младше программа обучения стала "лучше":
            - добавили гуманитария
            - убрали С/С++ (остался только паскаль/делфи)
            - убрали начерталку
            - поменяли порядок обучения:
            базовые дисциплины учат позже чем приходится их применять (на 2 курсе применяют асм, а на 3м - учат как писать на асм)
            вообщем супер...

            кстати фишка: кандидатов технических наук, которые работали в своей сфере по 30 лет, упразднили, и теперь они попросту Никто, - зато вот студенты после магистратуры, которые учились у этих же препов - сразу докторами технических наук выходят Х_х
            Ответить
            • Походу мы учились в одном ВУЗе ил на край в одной стране
              Ответить
            • надо было на прикладную математику идти (БГУ рулит!). мехмат тоже ничего.

              без правильной мат подготовки, обучение программированию говно.

              с правильной мат подготовкой - даже басик тебя уже не проймет.
              Ответить
              • такого не было. из тех, которые связаны с ИТ были:
                - Программное обеспечение автоматизированных систем (программер)
                - комп. системы и сети (одмин)
                Ответить
                • нам давали облегченный курс математики: матан, дифуры, прикладная алгебра, числовая математика, матлогика, и прочее. програмирование/математика было где-то 50/50.
                  Ответить
                  • гуманитарий: 13 дисциплин
                    программирование(+теория): 10 дисциплин
                    математика: 5 дисциплин
                    электро-схемотехника: 5 дисциплин
                    другие: { физика, начерталка, экономика }
                    -- и это пля программа для программиста нах...

                    зы: недостаток математики ощущается лишь при решении задач с довольно серьёзной математикой.
                    а при прикладном программировании и уж тем более при изучении языков - оной нехватки никогда не ощущал...
                    Ответить
                    • > недостаток математики ощущается лишь при решении задач с довольно серьёзной математикой.

                      гы гы. это ты всей правды не знаешь.

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

                      другими словами фактуально большинство математики программистам нафиг не сдалось - но побочные эффекты изучения математики имеют долгосрочный позитивный эффект.
                      Ответить
                      • Последний абзац — +1.
                        Развить матмышление, анализ программистам полезно, щитаю. Да и по жизни прикольно:)
                        Ответить
                      • > побочные эффекты
                        диагноз?
                        Ответить
                        • из любого нормального человека делает интроверта-алкоголика. лол.

                          ЗЫ ну я русский уже мало по малу забываю... да и кроме как на асме точно свои мысли выражать ни на каком другом языке никогда не умел.
                          Ответить
                          • что бы не сделал - технари, не брезгуйте, находите время развиваться в иных направлениях!
                            Ответить
                      • Лучшие программисты, которых я видел, имели физмат образование. Худшие уебки, включая самого меня - Computer Science
                        Ответить
                        • Ты эти сказки маме рассказывай. Хотя в рашке всё могёт быть

                          > Худшие уебки

                          прочитал: худшие вебкилы
                          Ответить
                          • Теперь даже Вебкилла не пугают вебкиллы во множественном числе.
                            Кстати,
                            http://bg.wikipedia.org/wiki/Уебсайт — есть,
                            http://bg.wikipedia.org/wiki/Уеб_сървър — есть,
                            http://bg.wikipedia.org/wiki/Уеб_браузър — есть,
                            http://bg.wikipedia.org/wiki/Уеб_дизайн — есть,
                            Уебкила почему-то в Уикипедии нет.
                            Ответить
                            • bg - bolgenOS?
                              Ответить
                              • Поработаю кэпом. bg — это болгарский.

                                А вот по-македонски и по-сербски будет неинтересно, там будет на букву «В».
                                Ответить
                                • а кто сказал, что мне требовалась подсказка кэпа? у меня такие шутки
                                  Ответить
                          • Ну и чем так хорош етот ваш факультет Компутер Сайенс? Какие такие знания там дают, какие не осилит выпускник физмата? У тебя блядь от теормеха или теории категорий елда стоять перестанет -недецкие знания все-таки - совсем не сравнить с недо-наукой компутеров. К тому же, ознакомление с математикой УЖЕ дает нужную подготовку к программированию - абстракции, формализм, функции и функционалы (типы). А в компутер сайенс максимум что дают именно для развития бошки ето дискретную математику, ну еще теоретическую грамматику.

                            Не видел ни одного еблана из физтеха, который бы не смог решать поставленные задачи, при етом выдавая не-говнокод.
                            Ответить
                            • не от образования всё зависит, а от индивида;
                              хоть век старайся обучить человека с гуманитарным складом ума умению думать формулами и какими-то абстракциями -- ничего хорошего из этого не выйдет.
                              если человеку не дано -- он не сможет понять.
                              (равносильно, научить свинью летать)

                              а человеку с врождённым математическим умом - физмат просто помогает развить то что у его уже есть.
                              (подбрасывают птицу, чтобы она полетела)

                              к тому же, школьное образование - гавно, оно убивает личность и все таланты ребёнка (вместо их развития).
                              единственное нормальное обучение может быть только в специализированных учебных заведениях, но таковых не много и обучение там дорогое...

                              так что в большинстве случаев Физмат или КС - не решают толком ничего =)
                              Ответить
                              • > школьное образование - гавно, оно убивает личность и все таланты ребёнка
                                истинная правда, причем во всех направлениях. жы шы через букву ы учать писать, а вот более важному, например, межличностным отношениям - нет
                                Ответить
                              • (привяжусь к своему триду, чтобы читабельнее было)

                                дело даже не в отношениях
                                (у нас кстати в этом плане делали акцент: рассаживали мальчик+девотька, иногда заставляли работать в команде;
                                но это всё было инициативой классного руководителя и не всегда проходило успешно: один работает двое скатывают, разделения труда не получалось...)

                                но дело не в том...
                                - школьное образование убивает таланты...

                                если ребёнок имеет гениальный математический ум и уже в первом классе думает формулами и умеет анализировать полученные знания - его пинают, чтобы не выделялся из остальной массы, которая до сих пор 2+2 считает на пальцах..
                                Ответить
                                • точно-точно. Из своего опыта: меня научили нормально читать еще до того, как я пошел в школу.
                                  И что? Училка в первом классе давай жаловаться на меня, что я не умею читать!
                                  Родители: как это, он у нас уже нормально читает!
                                  А она: мы учимся читать по слогам, а он не читает по слогам!
                                  Ответить
                              • вот только не понятно зачем?:
                                - всемирный заговор
                                - или просто неадекватность учителей

                                да и вообще:
                                - любому ежу известно, что ложка дёгтя испортит бочку мёда (ну или большую его часть).

                                так почему же Преподавательский состав в школе объединяет Преуспевающих, Нормальных и Отстающих учеников?
                                - в глупой надежде на то что отстающие подтянутся?
                                - или они не знают, что 1 отстающий потянет за собою на дно несколько преуспевающих?
                                бред это всё...

                                как говорил один из знакомых препов: "Управлением должны заниматься Технари, а не экономисты или гуманитарий. Гуманитарный склад ума просто не подходит для управления или планирования..."
                                а у нас?:
                                - управление на гуманитарии
                                - планирование на гуманитарии
                                - образование на гуманитарии
                                - а техники == простые рабочие...

                                пока эта система не изменится - наша Страна {страны СНГ} будут в говне...
                                Ответить
                                • > вот только не понятно зачем?
                                  заговор для авторов заговора
                                  неадекватность учителей, поставленных по безалаберности стоящих, но по плану авторов заговора
                                  Ответить
                        • Не говори об уёбке.
                          Ответить
            • итог, который я вынес сам после обучения: чему учат в универе - устаревшее г, и приходится обучаться самому. универ мне в программировании ничего не дал, я уже самостоятельно все то изучил до него (если не считать, что С\С++ я постарался забыть сразу)
              Ответить
            • итог:
              >>>- 4 года потрачено в пустую (заданий много, толку с них >>>практически нету: 1 месяц каникул прошёл гораздо продуктивнее, чем 1 год обучения в универе)
              >>>- ненависть к паскалю (делфи)

              отличный пост. +100

              >>>- ненависть к людям
              те кто поражены синдромом вахтера уже не люди.
              Ответить
            • Подписываюсь. :(
              Ответить
            • 13 гуманитарных предметов — это не только на программерских специальностях, а у всех технарей и естественнонаучников. Причём читают эти предметы те, кто понимает в этом чуть менее, чем нихрена, потому что не нашли работу по специальности.

              Обратный порядок изучения (сначала применение предмета, потом сам предмет) — аналогично.

              Деморализация — аналогично.

              Зубрёжка заточенного под конкретную версию, что устареет через полгода и придётся зубрить заново, вместо умения думать — ну это вообще современное гуманитарное образование.

              А ещё чиновники жалуются, что слишком мало «гуманитарщины» в вузах.

              Более того, могут забыть прочитать предмет, необходимый для дипломной работы. А ещё могут по ходу обучения сменить название специальности в дипломе и программу обучения, не предупредив об этом студентов. Лотерея: угадай, что будет написано у тебя в дипломе. И чиновникам это кажется нормальным.

              Чорт, на какие темы потянуло! А начиналось всё с говнокода...
              Ответить
              • Это у каких-таких технарей так? Шо там еще можно изучать?
                К нас, математиков, как помню, из гуманитарных было история Отечества, философия, английский, экономическая теория и физра. А, история и методология матки еще. Итого 6.
                Ощущаю острую нехватку ГСМ, потому увлекся языками:)
                Ответить
                • Стало быть, культурология, политология, социология, психология, история_всякой_хрени прошли стороной?
                  Ответить
                  • А, не, вру, социология была. Остальных не было:)
                    И Бог миловал, ни исткома, ни политэка тоже не было:)
                    Ответить
            • ZOMG, нытик-тред!
              Ответить
          • Если бы каждый вебщик хотя бы пол года своей жизни писал бы на сях -- PHP бы не было
            Ответить
      • Нафиг сдвиги. Число Х является степенью двойки тогда и только тогда, когда
        X & (X-1) == 0
        Ответить
        • Матан! Жумлой клянусь, матан это!
          Ответить
          • Совсем недавно в одном из ГК были ссылки на настоящий матан (с вещественной арифметикой, хитрыми константами и т. п.).
            Может быть, кто-нибудь вспомнит, где это было? Или у меня дежавю?
            Ответить
            • 3454
              Ответить
              • Спасибо! Именно это я и искал.
                Ответить
                • Где матан? О_о Простейшая тема.
                  Ответить
                  • Имеется в виду не сам ГК, а вот эта ссылка:
                    http://graphics.stanford.edu/~seander/bithacks.html
                    Хотя и там не матан (исчисление бесконечно малых), а всего лишь целочисленная арифметика, только формулы для многих неочевидны.
                    Ответить
          • да-да. я сделал сотни сайтов на phpbb, и без всякого матана
            Ответить
        • показать все, что скрытоДурак что ли? Ну как ноль может быть одновременно иксом и иксом минус один?
          Ответить
          • это побитовое сравнение, а не логическое И:
            x = 4;

            4 & (4 -1) == 0 ?
            100b & 011b == 0 -> степень двойки

            x = 5;
            5 & (5-1) == 0 ?
            101b & 100b == 100b != 0 -> не степень двойки
            Ответить
            • Спасибо, КЭП.
              Так вот, автор говнокода, не умеющий даже двойку в степень возводить, спросил бы ровно то же, что и я.
              Ответить
              • http://img1.liveinternet.ru/images/attach/c/0//45/270/45270651_1245299483_kapitanochevidnost.j pg
                Ответить
          • char x = 0; //char ибо у него всего 8 бит, аналогичное с 16, 32 и 64 бита
            0 & (0-1) == 0 ?
            0b & (1111 1111b) == 0 -> степень двойки

            но т.к. (x^n != 0), если (x є N)
            то x = 0 - это исключительная ситуация, которую нужно проверять отдельно
            Ответить
          • Надо было мне для наглядности скобки поставить.
            Ответить
            • И мне тоже. Закрывающиеся, в конце предложения.
              Ответить
              • <irony></irony>?
                Ответить
                • Семантический хтмл? Ещё до кучи &smile; добавить. И семантический CSS и JS разработать. И тогда будет восстание машин, ибо у техники появятся чувства.
                  Ответить
                  • псевдоразметка, не для машин, а для людей. Странно, но в интернете на форумах пользуется популярностью.
                    хотя мысль интересная: вместо :))))) писать &lol;
                    Ответить
                    • Не сразу поймут. К псевдолисповским скобочкам уже все привыкли.
                      Ответить
                      • кстати, наравне популярен и bbcode вариант: например, [sarcasm][/sarcasm]
                        скобочки лучше читаются за счет визуального представления ( например, легко понятно, что :-) - это глаза,нос,рот, только 90ccw, а :-))))))))))))) - это анимация в стиле комикса )
                        но &lol; внушает больше уважения, мол, надо же, знаешь хтмл ))))
                        Ответить
                        • cout << "lol" << endl;
                          Ответить
                          • +1! спасибо, улыбнули. Но для среднеразвитых мартышек это черезчур думательная конструкция

                            так можно и уйти в варианты:
                            echo LOL;
                            ?>lol<?
                            db L O L ;LOL
                            <?="lol"?>
                            10 PRINT "LOL":
                            ну и так далее, пока не надоест )
                            Ответить
                        • Внезапно, &lol; это SGML
                          Ответить
                          • У меня была такая же мысль, но чтобы все признали в этом SGML, нужно добавить ещё каких-нибудь дифайнов.
                            Ответить
                          • вспомнили про мамонтов, когда уже слоны гуляют.
                            и хтмл, и хмл это все наследники сгмл. ну и что? сгмл умир ведь, да?
                            Ответить
        • крутой способ, спасибо за урок =)
          я бы решил задачу, руководствуясь тем, что степень двойки в битовом представлении имеет "1" лишь в одном разряде, а в остальных "0"
          типа такого (псевдокод)
          digit = .... 
          cnt = 0 // кол-во единиц
          while (digit) {
          	cnt += digit & 1
          	break if cnt > 1
          	digit >>= 1
          }
          return cnt == 1
          Ответить
          • На асме можно ещё круче.
            Ещё во времена 80386 или 80486 появились инструкции BSR и BSF, возвращающие номер первого и последнего установленного бита в числе. Если эти результаты совпадают, то степень двойки. Жаль, некроссплатформенно... То же можно сделать циклом через сдвиг с переносом, это будет более переносимо (простите за каламбур).
            Ответить
      • в js такое большое число сдвигами ниасилить
        Ответить
    • А вообще говно шикарное - вот до чего доводит незнание двоичной арифметики.
      Было бы круче, если он степень двойки через for считал.
      Хотя, может, это типа такой кроссплатформенный код, который будет выполняться и на троичных компах?
      Ответить
      • Он и так for'-ом считает.

        И как ты себе представляешь троичные компы?
        Ответить
        • полагаю тут циклически имелось ввиду:
          var x = false;
          for (var i = 0; i < 50; i++) {
          	for (var aa = 1, var j = 0; j < i; j++, aa *= 2); //циклический расчёт степени (замена Math.pow());
          
          	if (aa == a) { x = true; }
          }
          Ответить
          • Цикл гавно, лучше воспользоваться вот этим http://govnokod.ru/2644
            Ответить
            • мб тогда уж лучше такой рекурсией?:
              double mypow(double x, int n) {
                if (n) { return x*mypow(x, n-1); }
                else return x;
              }
              Ответить
              • т.е. на JS это будет чот типа:

                function mypow(var x, var n) {
                  if (n) { return x * mypow(x, n-1); }
                  else { return x; }
                }
                Ответить
              • во, даже так:
                function mypow(x, n) {...}
                Ответить
        • >И как ты себе представляешь троичные компы?
          В гуугле забанили? Странно, вроде ты не из буйных...
          http://ru.wikipedia.org/wiki/Троичный_компьютер
          Ответить
          • Хочу такой!

            Вспомнился анекдот. Спрашивают программиста:
            — Сколько будет два в квадрате?
            — Четыре.
            — А в кубе?
            — Восемь.
            — А в восьмой степени?
            — 256.
            — А в двенадцатой?
            — 4096.
            — А в шестнадцатой?
            — 65536.
            — А в двадцать четвёртой?
            — 16 777 216.
            — А сколько будет три в кубе?
            — Не знаю. Дробное число получится, наверное...
            Ответить
        • +, 0, -
          Ответить
      • Добавлю немного офтопа. Есть ещё двоичные компы, но с нестандартным размером слова. Например, DEC PDP-10 (36 бит в слове) и БЭСМ-6 (48 бит в слове). Если регистр БЭСМ-6 ещё можно разбить на шесть байт или три двухбайтных слова, то с PDP-10 у компилеростроителей возникли проблемы. Было решено для компилятора Си разбить регистр на четыре девятибитных байта. Великолепный сюрприз для программистов! Так родилась непризнанная кодировка UTF-9.
        Ответить
        • UTF-9 это прикол, они в RFC любят такое как к примеру протокол передачи пакетов голубиной почтой
          UTF-9 and UTF-18 (9- and 18-bit Unicode Transformation Format, respectively) were two April Fools' Day RFC joke specifications for encoding unicode on systems where the nonet (nine bit group) is a better fit for the native word size than the octet, such as the 36-bit PDP-10.
          Ответить
          • Потому я и написал «непризнанная». Но тем не менее проблемы с совместимостью компиляторов на машинах с нестандартными размерами регистров имеются.

            Про голубиную почту читал, даже с QoS, про флажковую азбуку и про передачу электричества через IP. Всё это выглядит несерьёзно, но ведь когда-то даже 300 бод считалось нормальной скоростью для модема. А может, голубь на себе будет нести флэшку с архивом пакетов? Или флажками махать робот?

            Только что обнаружил ссылку: http://ru.wikipedia.org/wiki/Первоапрельские_RFC . Спасибо за замечание, ещё несколько подобных RFC нашёл!
            Ответить
    • with (Math) { return log(X) % LN2 > 0 } // O(1)
      Ответить
      • Да ну, неинтересно так. Вы представляете, сколько инструкций необходимо для вычисления логарифма?
        Ответить
        • логарифм будет выполнятся быстрее чем цикл, приведённый в сабже.
          Ответить
          • Эээ
            Приведите, пожалуйста, пример вычисления логарифма на асме
            Ответить
            • fyl2x - двоичный логарифм и не парьте себе моск.
              опять я на асме сделал в одну строку )))
              Ответить
              • Спасибо, не знал :)
                Ответить
                • так мало того что она ьерет логарифм от st0 она еще и умножает резалт на st1 - что позволяет сходу брать логарифмы по любому основанию

                  а еще есть команда начин. с fyl2 тока она прибавлет к результату 1 кажись
                  Ответить
                  • я прочитал, что делает fyl2x ;)
                    Ответить
                    • зачем тогда спрашивать такие простые вещи если сам смог нагуглить описание?
                      Ответить
                      • Ну, честно говоря, мысль погуглить не возникла потому, что я даже не задумывался о возможности существования данной инструкции :)
                        Ответить
      • кстати, тут ошибка:

        log(X) % LN2
        будет возвращать > 0, если это Не степень двойки, а функция проверяет на степень двойки:
        1 - да, степень
        0 - нет...

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

        зы: и вообще тут кажется грубая ошибка: лог() возвращает Вещественное число, -- а операнд % можно применять только к целым;
        а если даже транслятор превратит Вещественные в Целые - то вылезет ошибка: откинется значение после запятой...
        Ответить
        • Меня тоже смутила операция извлечения остатка для вещественных. Должно быть что-то вроде
          with(Math) {return log(X) / LN2 - floor(log(X) / LN2) == 0;}
          Но это жутко ненадёжно, потому что про сравнение вещественных на точное равенство мы уже писали.
          Ответить
        • кажется, уголовный кодекс спецификации надо чтить:
          NOTE In C and C++, the remainder operator accepts only integral operands; in ECMAScript, it also accepts floating-point operands.

          а условие я инвертировал, каюсь
          Ответить

    Добавить комментарий