Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Практика: перевод десятичных чисел в двоичные и наоборот (https://javascript.ru/forum/study/30047-praktika-perevod-desyatichnykh-chisel-v-dvoichnye-i-naoborot.html)

Magneto 22.07.2012 14:54

Практика: перевод десятичных чисел в двоичные и наоборот
 
Нужно создать 2 функции (метода), одна будет переводить десятичные числа в двоичные, а вторая наоборот, двоичные в десятичные. Приветствуются все варианты, самые минимизированные, самые быстрые и оригинальные.

P.S. мой вариант где-то ниже.

devote 22.07.2012 15:03

alert( (20).toString(2) ); // 10100
alert( parseInt( "10100", 2 ) ); // 20

Magneto 22.07.2012 15:21

круто, кому то нужно повторить основы.

devote 22.07.2012 15:35

ну если так нужны функции то вот:
function toBIN( num ) {
    var out = "", bit = 1;
    while( num >= bit ) {
        out = ( num & bit ? 1 : 0 ) + out;
        bit <<= 1;
    }
    return out || "0";
}

alert( toBIN(20) );

function toDEC( dec ) {
    var out = 0, len = dec.length, bit = 1;
    while( len-- ) {
        out += dec[ len ] == "1" ? bit : 0;
        bit <<= 1;
    }
    return out;
}

alert( toDEC( '10100' ) );

9xakep 24.07.2012 14:36

devote,
function toBIN( num ) {
    var out = "", bit = 1;
    while( num > bit ) {
        out = ( num & bit ? 1 : 0 ) + out;
        bit <<= 1;
    }
    return out || "0";
}
*!*
alert( toBIN(4) );
*/!*
function toDEC( dec ) {
    var out = 0, len = dec.length, bit = 1;
    while( len-- ) {
        out += dec[ len ] == "1" ? bit : 0;
        bit <<= 1;
    }
    return out;
}

alert( toDEC( '0100' ) );

9xakep 24.07.2012 15:03

Хех, разобрал алгоритм на бумажке, ошибка заключалась в этом:
function toBIN( num ) {
    var out = "", bit = 1;
*!*
    while( num >= bit ) { // >=
*/!*
        out = ( num & bit ? 1 : 0 ) + out;
        bit <<= 1;
    }
    return out || "0";
}
alert( toBIN(4) );
function toDEC( dec ) {
    var out = 0, len = dec.length, bit = 1;
    while( len-- ) {
        out += dec[ len ] == "1" ? bit : 0;
        bit <<= 1;
    }
    return out;
}

alert( toDEC( '0100' ) );

Когда bit == 4, условие не выполнялось, и выводило тот результат, который был уже, а это: 00

devote 24.07.2012 15:19

Цитата:

Сообщение от 9xakep
Хех, разобрал алгоритм на бумажке, ошибка заключалась в этом:

ну яж и не тестил, написал так по быстрому особо не обдумывая.. Понятно дело без ошибок быстро не напишешь. Суть то ясна, да и код наипростейший. Для этих целей.

9xakep 24.07.2012 20:16

devote,
Кому как, до мне бы эта строка вряд ли бы в голову пришла:

out = ( num & bit ? 1 : 0 ) + out;

devote 24.07.2012 20:21

Цитата:

Сообщение от 9xakep
Кому как, до мне бы эта строка вряд ли бы в голову пришла:

ну а что тут неясного, обычная проверка присутствия бита, бит есть ставим 1, бита нету ставим ноль... В таких языках как Си, и подобных это обычное дело. Там часто с битами работать приходится. Особенно ассемблер :)

9xakep 24.07.2012 20:40

devote,
Аа...чувак, точно, это ж элементарно, ты просто по сути считываешь само число по разрядно (вначале последний бит с 0001, потом предпоследний с 0010)


Часовой пояс GMT +3, время: 11:24.